前言

最近由于课程需要接触到了selenium,本着应付作业的心态去学习了下,在学习过程中意外发现这个工具可玩性很高,可以自动化完成很多操作,为懒狗的进化提供了必要条件。学习新东西就是为了更好的解决问题,作为初学者的记录,下面详细记录了我想到的两个应用场景,以及实现两个自动化脚本的编写过程,欢迎各位大佬们指点。  

前期准备

1、提前装好selenium

pip install selenium

2、下载谷歌驱动

这里我的谷歌是最新版的 下载对应版本驱动 链接: http://chromedriver.storage.googleapis.com/113.0.5672.63/chromedriver_win32.zip 解压放到添加了系统变量的目录下 我这里放到了C盘的system目录下 在cmd测试如下就能正常使用了

学习通自动登陆

刚接触学习通的时候每次搜索都在纠结“真假学习通”,忘记账号密码的情况也不在少数,所以第一个目标来写一个简单的学习通自动登陆脚本 首先找到正确的学习通登陆页面: 用户登录 (chaoxing.com) 导入对应库,初始化url访问

from selenium import webdriver browser = webdriver.Chrome() browser.get(‘https://passport2.chaoxing.com/login?fid=&newversion=true&refer=https://i.chaoxing.com‘)

在手机号一栏右键查看元素,找到对应的标签 通过selector找到对应元素,send_keys模拟键盘输入:

kw=browser.find_element(By.CSS_SELECTOR,’#phone’) kw.send_keys(‘你的手机号码’)

  密码也是同理:

kw=browser.find_element(By.CSS_SELECTOR,’#pwd’) kw.send_keys(‘你的密码’)

  最后找到登录按钮查看元素,复制selector,.click()方法模拟点击即可

button = browser.find_element(By.CSS_SELECTOR,’#loginBtn’) button.click()

  完整脚本如下: from selenium import webdriver from selenium.webdriver.common.by import By import time   def login():        browser = webdriver.Chrome()        browser.get('https://passport2.chaoxing.com/login?fid=&newversion=true&refer=https://i.chaoxing.com')        kw=browser.find_element(By.CSS_SELECTOR,'#phone')        kw.send_keys('13663157982')        time.sleep(1)        kw=browser.find_element(By.CSS_SELECTOR,'#pwd')        kw.send_keys('aA123456')        time.sleep(1)        button = browser.find_element(By.CSS_SELECTOR,'#loginBtn')        button.click()        time.sleep(30)   if __name__ == '__main__':        login()   测试:

问卷星自动答题

写完上面的学习通脚本我又想起来上个月的需求分析作业,当时使用问卷星找人填写表单麻烦得很,虽然比学习通登陆脚本复杂得多,但想法就是动力,于是乎就有了下面这个脚本: 测试问卷: https://www.wjx.cn/vm/teLIsXF.aspx 这是一个有五个问题的问卷,其中单选题4个,填空题一个,网页默认是禁用右键的 先F12打开开发者模式查看源代码,找到题目部分对应的标签: 这里我们使用class定位,获取到全部题目

rank=driver.find_elements(By.CLASS_NAME,”field.ui-field-contain”)

这里的题目标签的type代表题目的类型,3代表单选题,1代表填空题 单选题每个题目下的ui-radio类为选项 而填空题的标签我们依然可以使用selector去定位 那么答题部分完整的思路就有了,首先获取到所有题目标签,通过遍历判断每一个题目的属性,如果是单选题(type=3)就用class类定位,随机click点击去选择,如果是填空题(type=1)就用selector定位,然后使用.send_keys键入,代码如下:

rank=driver.find_elements(By.CLASS_NAME,”field.ui-field-contain”) for i in range(len(rank)): type=rank[i].get_attribute(“type”) if(type == ‘3’): choose=rank[i].find_elements(By.CLASS_NAME,”ui-radio”) ra=random.randrange(0,len(choose)-1) choose[ra].click() if(type == ‘1’): input=rank[i].find_element(By.CSS_SELECTOR,’#q5’) print(input) input.send_keys(‘我希望添加一个从本机选择图片去识图的功能!’) time.sleep(1)

  全部答完后提交 这里的提交按钮使用id定位 但测试过程中,点击提交后出现验证弹窗 经过审计这里的确认也可以通过class进行定位 定位后模拟点击:

go1=driver.find_elements(By.CLASS_NAME,”layui-layer-btn0”)[0].click()

但点击后又出现一个人机验证 继续查找,这里通过id进行定位 定位后模拟点击:

go2=driver.find_elements(By.ID,”captcha”)[0].click()

但还是被检测到是脚本,人机验证不通过 在网上找了一个解决办法,添加options,类似于http报文更换header头

chrome_options = Options() chrome_options.add_argument(“–disable-blink-features=AutomationControlled”) chrome_options.add_experimental_option(‘excludeSwitches’, [‘enable-automation’]) chrome_options.add_argument(‘user-agent=Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/98.0.4758.82 Safari/537.36’) driver = webdriver.Chrome(options=chrome_options)

测试成功: 运行过程: 完整代码如下: from selenium import webdriver import random from selenium.webdriver.common.by import By from selenium.webdriver.chrome.options import Options import time   chrome_options = Options() chrome_options.add_argument("--disable-blink-features=AutomationControlled") chrome_options.add_experimental_option('excludeSwitches', ['enable-automation']) chrome_options.add_argument('user-agent=Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/98.0.4758.82 Safari/537.36') driver = webdriver.Chrome(options=chrome_options) #driver = webdriver.Chrome() driver.get('https://www.wjx.cn/vm/teLIsXF.aspx') def auto_answer():        rank=driver.find_elements(By.CLASS_NAME,"field.ui-field-contain")        #print(rank)        #print(len(rank))        for i in range(len(rank)):               type=rank[i].get_attribute("type")               if(type == '3'):                      choose=rank[i].find_elements(By.CLASS_NAME,"ui-radio")                      #print(choose)                      ra=random.randrange(0,len(choose)-1)                      choose[ra].click()               if(type == '1'):                      input=rank[i].find_element(By.CSS_SELECTOR,'#q5')                      print(input)                      input.send_keys('我希望添加一个从本机选择图片去识图的功能!')                      time.sleep(1)        time.sleep(2)        button = driver.find_element(By.ID,'ctlNext')        button.click()        time.sleep(2)        #time.sleep(20000)        go1=driver.find_elements(By.CLASS_NAME,"layui-layer-btn0")[0].click()        #time.sleep(100000)        go2=driver.find_elements(By.ID,"captcha")[0].click()        #print(go2)        #driver.find_element_by_xpath("//div[@id='captcha']").click()        print("end")        time.sleep(10)   if __name__ == '__main__':        auto_answer()