import random
import numpy
import time
from selenium import webdriver
from selenium.webdriver.common.by import By
url = 'https://www.wjx.cn/vm/YaWEvQB.aspx'
#生成滑动轨迹
#生成m到n之间的o个不重复的数字列表(用于多选题)
def multiple_random(m, n, o):
p = []
while len(p) < o:
new_int = random.randint(m, n) #生成m到n之间随机数
if new_int not in p:
p.append(new_int)
return p
def run():
# 避免被网站识别为自动化操作,模拟真实用户
option = webdriver.ChromeOptions()
option.add_experimental_option('excludeSwitches', ['enable-automation'])
option.add_experimental_option('useAutomationExtension', False)
driver = webdriver.Chrome(options=option)
driver.set_window_size(1400, 1000)
driver.set_window_position(x=0, y=0)
driver.execute_cdp_cmd('Page.addScriptToEvaluateOnNewDocument',
{'source': 'Object.defineProperty(navigator,"webdriver",{get: () => undefined})'
})
driver.get(url) #打开问卷链接
# todo:第1题单选
i = 1 #通过xpath定位到所有选项
xpath = '//*[@id ="div{}"]'.format(i) + '/div[2]/div' #每一道题的div
a = driver.find_elements(By.XPATH, xpath)
# 生成1到选项个数之间的随机数
#b = random.randint(1, len(a))
# 指定概率
b = numpy.random.choice(a=numpy.arange(1, len(a)+1), p=[0.5, 0.33, 0.17])
#Todo:"""
# 1.nth-child()代表的是子项目的第几个
# 2.click代表模拟点击
# """
driver.find_element(By.CSS_SELECTOR,
'#div{} > div.ui-controlgroup > div:nth-child({})'.format(i, b)).click()
# todo:第2题多选
i = 2 # 通过xpath定位到所有选项
xpath = '//*[@id ="div{}"]'.format(i) + '/div[2]/div' # 每一道题的div
a = driver.find_elements(By.XPATH, xpath)
b = random.randint(1, len(a)) # 生成1到选项个数之间的随机数
q = multiple_random(1, len(a), b) # 生成1到len(a)之间的b个随机数并返回列表
q.sort()
for r in q:
driver.find_element(By.CSS_SELECTOR,
'#div{} > div.ui-controlgroup > div:nth-child({})'.format(i, r)).click()
# todo:第3题填空
list_number = [405, 893, 329, 4343, 323, 131, 5331]
index = random.randint(0, len(list_number))
driver.find_element(By.CSS_SELECTOR, '#q3').send_keys(list_number[index])
#点击提交
driver.find_element(By.XPATH, '//*[@id="ctlNext"]').click()
#出现点击验证码验证
time.sleep(1)
#点击对话框的确认按钮
try:
driver.find_element(By.XPATH, '//*[@id="layul-layer1"]/div[3]/div[1]').click()
time.sleep(0.5)
#点击智能检测按钮
driver.find_element(By.XPATH, '//*[@id="SM_BTN_1"]').click()
time.sleep(3)
#滑块验证暂时可能会报错
except:
#关闭页面
time.sleep(3)
handles = driver.window_handles
driver.switch_to_window(handles[0])
#关闭当前页面并且如果当前浏览器只有一个页面将浏览器也关闭
driver.close()
count = 0
while True:
run()
count += 1
print('已填写{}份问卷----{}'.format(count, time.strftime('%H:%M:%S', time.localtime(time.time()))))
本文章使用limfx的vscode插件快速发布