简介:Selenium 是一个用于Web应用程序测试的工具。Selenium测试直接运行在浏览器中,就像真正的用户在操作一样。支持的浏览器包括IE(7, 8, 9, 10, 11),Mozilla Firefox,Safari,Google Chrome,Opera等。这个工具的主要功能包括:测试与浏览器的兼容性——测试你的应用程序看是否能够很好得工作在不同浏览器和操作系统之上。测试系统功能——创建回归测试检验软件功能和用户需求。支持自动录制动作和自动生成 .Net、Java、Perl等不同语言的测试脚本。
一、浏览器驱动
1. 不同的浏览器需要不同的驱动,这里给出几个常用的浏览器驱动地址
Firefox浏览器驱动
Chrome浏览器驱动
Edge浏览器驱动
https://developer.microsoft.com/en-us/microsoft-edge/tools/webdriver/
PhantomJs浏览器驱动
2. 安装
(首先你需要安装selenium这个库)
pip3 install selenium
以chromedriver为例
在window下直接将chromedriver.exe 文件拖到 Python 的 Scripts 目录下
验证安装
运行如下代码
from selenium import webdriver
browser = webdriver.Chrome()
弹出一个空白的浏览器框 即安装成功
二、元素定位
Selenium提供了8种定位方式。
- id
- name
- class name
- tag name
- link text
- partial link text
- xpath
- css selector
这8种定位方式在Python selenium中所对应的方法为:
- find_element_by_id()
- find_element_by_name()
- find_element_by_class_name()
- find_element_by_tag_name()
- find_element_by_link_text()
- find_element_by_partial_link_text()
- find_element_by_xpath()
- find_element_by_css_selector()
三、Webdriver常用操作
定位到元素后可以进行操作,点击、输入
- 文本框元素可输入
browser.find_element_by_id('kw').send_keys('python')
//即把python输入文本框
- 清除文本
browser.find_element_by_id('kw').clear()
//清空输入的元素
- 点击元素
browser.find_element_by_id('su').click()
例:
from selenium import webdriver
url = 'https://www.baidu.com'
browser = webdriver.Chrome()
browser.get(url)
browser.find_element_by_id('kw').send_keys('python')
browser.find_element_by_id('kw').clear()
browser.find_element_by_id('kw').send_keys('C++')
browser.find_element_by_id('su').click()
全过程截图:
- 表单提交
上例的click()可用submit()替换
submit()仅限于表单提交
click()的应用更广泛
- 返回文本
text = driver.find_element_by_id("u1").text
print(text)
注:网页源代码用selenium打开和自己手动打开会有区别!!千万注意!!
返回为此处的文本
- 返回元素的属性值
id、 name、 type 或其他任意属性
attribute = driver.find_element_by_id("su").get_attribute('value')
print(attribute)
打印百度一下按钮的value值
四、鼠标事件
提到鼠标事件就一定要说ActionChains,ActionChains类里面的操作十分多,这里就只粗略地记一些鼠标操作
perform(): 执行所有 ActionChains 中存储的行为;
- context_click(): 右击;
- double_click(): 双击;
- drag_and_drop(): 拖动;
- move_to_element(): 鼠标悬停。
以click()为例
from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains
browser = webdriver.Chrome()
browser.get("http://www.baidu.com")
name = browser.find_element_by_name("tj_trnews") #找到百度新闻这个元素
actions = ActionChains(browser)
actions.click(name).perform() #perform函数是必须的,与普通的cilck指令不同,这里没有perform就不会跳转到新闻界面
五、键盘事件
首先要导入keys类
from selenium.webdriver.common.keys import Keys
以下为常用的键盘操作:
- send_keys(Keys.BACK_SPACE) 删除键(BackSpace)
- send_keys(Keys.SPACE) 空格键(Space)
- send_keys(Keys.TAB) 制表键(Tab)
- send_keys(Keys.ESCAPE) 回退键(Esc)
- send_keys(Keys.ENTER) 回车键(Enter)
- send_keys(Keys.CONTROL,‘a’) 全选(Ctrl+A)
- send_keys(Keys.CONTROL,‘c’) 复制(Ctrl+C)
- send_keys(Keys.CONTROL,‘x’) 剪切(Ctrl+X)
- send_keys(Keys.CONTROL,‘v’) 粘贴(Ctrl+V)
- send_keys(Keys.F1) 键盘 F1
- ……
- send_keys(Keys.F12) 键盘 F12
六、元素等待
- 隐式等待
当Selenium在DOM中没有找到节点,就继续等待,超出特定时间后则抛出找不到节点的异常,等待时间默认为0。但是只规定了一个固定时间,而页面的加载时间受网络条件影响,我们并不能知道具体的加载时间,这个固定时间很难设置。
- 显式等待
指定一个最长等待时间,只要在等待时间之内能加载出该节点,那么就结束等待,否则抛出超时异常。
实践
爬取五律协同观题库
import requests
from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
import time
import re
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
def answer(url):
browser.get(url)
var = 1
total =[]
while(var==1):
try:
question = browser.find_element_by_xpath('/html/body/div/div/p')
total.append(question.text)
total.append('\n')
texts = browser.find_elements_by_xpath('/html/body/div/div/div[1]/p') # 用于保存题目
for i in texts:
total.append(i.text)
total.append('\n')
for i in browser.find_elements_by_xpath('/html/body/div/div/div[1]/p[1]'): #模拟点击A选项
i.click()
button2 = browser.find_element_by_class_name('ensure') #模拟点击确认
button2.click()
wait = WebDriverWait(browser,10)
button3 = wait.until(EC.element_to_be_clickable((By.CLASS_NAME,'next'))) #显式等待直到可以点击该元素 “下一题”
button3.click()
correct = browser.find_element_by_class_name('correct').get_attribute('style')
print(correct)
if correct == 'display: block;':
total.append('答案:A')
total.append('\n')
else:
answers = browser.find_element_by_xpath('/html/body/div/div/div[4]/p[2]/span')
total.append('答案:')
total.append(answers.text)
total.append('\n')
time.sleep(1)
except Exception: #无法点击下一题的时候开始另一个题库的爬取
var=2
f = open('question_bank.txt','a')
for i in total:
f.write(i)
f.close()
browser = webdriver.Chrome()
# 设置网站等待时间
wait = WebDriverWait(browser, 10)
url='http://www.bigcourse.cn/p/login.aspx'
session = requests.Session()
browser.get(url)
html = browser.page_source
time.sleep(3)
url="http://www.bigcourse.cn/m/my/grouplist.aspx?groupid=22"
browser.get(url)
response=browser.page_source
result = re.findall('<li "go\(\'(.*?)\'\)"',response)
for i in result:
answer(i)
------------------------------分割线------------------------------
目前的程序只能做到登录微信(账号是微信),不过这个登陆是手动扫码,但是不知道如何直接用微信接口登陆,还没找到什么好的方法。其次是模拟自动做题,然后爬取题目,根据反馈得到答案,数据并没有很好的管理方式,用数组存的然后写入txt
总共766题
爬取时间30-40分钟
部分题目并未爬取到答案(未知情况)
--------------------------------更新--------------------------------
部分未爬取到是因为爬取顺序出错,先点了下一题才开始爬题目,有的时候因为刷新太快导致没有来得及爬取到
修改顺序后要在点击确认之后暂停一下,让答案加载,否则无法爬取正确答案
但是这样要前后暂停两秒
并且在点下一题之后必须暂停,否则无法爬取,会出现错误
时间更长了……