问卷星自动化填写

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插件快速发布