selenium
1.原理与安装
1.1原理
Selenium 是一个 Web 应用的自动化框架。
通过它,我们可以写出自动化程序,像人一样在浏览器里操作web界面。 比如点击界面按钮,在文本框
中输入文字 等操作。(相当于真正的浏览)
而且还能从web界面获取信息。 比如获取12306票务信息,招聘网站职位信息,财经网站股票价格信息
等等,然后用程序进行分析处理。
selenium 自动化流程如下:
-
自动化程序调用Selenium 客户端库函数(比如点击按钮元素)
-
客户端库会发送Selenium 命令 给浏览器的驱动程序
-
浏览器驱动程序接收到命令后 ,驱动浏览器去执行命令
-
浏览器执行命令
-
浏览器驱动程序获取命令执行的结果,返回给我们自动化程序
-
自动化程序对返回结果进行处理
1.2安装
打开命令行程序,运行如下命令
pip install selenium
安装浏览器驱动
注意浏览器版本号一致
浏览器驱动 是和 浏览器对应的。 不同的浏览器 需要选择不同的浏览器驱动。
目前主流的浏览器中,谷歌 Chrome 浏览器对 Selenium自动化的支持更加成熟一些。强烈推荐大家使
用 Chrome浏览器。
pip install seleniumhttps://www.google.cn/chrome/
在浏览器上面输入:chrome://version/ 命令 查看自己下载的浏览器的版本
确保Chrome浏览器安装好以后,请大家打开下面的连接,访问Chrome 浏览器的驱动下载页面
https://chromedriver.storage.googleapis.com/index.html
注意浏览器驱动 必须要和浏览器版本匹配,版本号 就是和浏览器版本号对应的
安装时直接解压到python环境变量里面
1.3简单示例
下面的代码, 可以自动化的 打开edge浏览器,并且自动化打开百度网站,可以大家可以运行一下看
看。
from selenium import webdriver
# 创建 WebDriver 对象,指明使用edge浏览器驱动,r后面相当于上面的driver的解压地址,安装在python环境变量中就填空就行
wd = webdriver.Edge(r'd:\webdrivers\edgedriver.exe')
# 调用WebDriver 对象的get方法 可以让浏览器打开指定网址
wd.get('https://www.baidu.com')
2.Selenium高级操作(隐藏浏览器界面)
options=webdriver.ChromeOptions()
options.add_argument('--headless')
#1、创建浏览器对象-打开浏览器
#driver=webdriver.Chrome()
driver=webdriver.Chrome(chrome_options=options)
3.Selenium常用函数
3.1 浏览器对象
浏览器对象browser常用方法及属性
browser.get():地址栏输入url地址并确认
browser.quit():关闭浏览器
browser.close():关闭当前页
browser.gmaximize_window():浏览器窗口最大化
browser.page_source:HTML结构源码。(即前端的源码)
browser.page_source.find(‘字符串’):从源码中查找指定字符串,返回源码大概的位置。如果没有
就返回-1,常用于判断最后一页
#假设说网页非最后一页的“下一页”的源代码为class='pn-next'
#网页最后一页的“下一页”的源代码为class='pn-nextdisabled'browser.page_source.find('pn-nextdisabled')==-1 #说明不是最后一页
3.2 定位节点
元素查找 - 返回值为节点对象或节点对象的列表
定位一个元素 | 定位多个元素 | 含义 |
---|---|---|
find_element_by_id() | find_elements_by_id() | 通过元素id |
find_element_by_name() | find_elements_by_name() | 通过元素name定位 |
find_element_by_class_name() | find_elements_by_class_name() | 通过类名进行定位 |
find_element_by_xpath() | find_elements_by_xpath() | 通过xpath表达式定位 |
find_element_by_link_text() | find_elements_by_link_text() | 通过完整超链接定位 |
find_element_by_partical_link_text() | find_elements_by_partical_link_text() | 通过部分链 |
find_element_by_tag_name() | find_elements_by_tag_name() | 通过标签定 |
find_element_by_css_selector() | find_elements_by_css_selector() | 通过css选择 |
例子:
# 假设网页源代码如下:
<!--假设页面源代码如下:--><html>
<head>
<bodylink="#0000cc">
<aid="result_logo"href="/"onmousedown="return c({'fm':'tab','tab':'logo'})">
<formid="form"class="fm"name="f"action="/s"> <spanclass="soutu-btn"></span>
<inputid="kw"class="s_ipt"name="wd"value=""maxlength="255"autocomplete="off">
...
#通过id定位
driver.find_element_by_id("kw")
#通过name定位
driver.find_element_by_name("wd")
#通过classname定位
driver.find_element_by_class_name("s_ipt")
#通过tagname定位
driver.find_element_by_tag_name("input")
#通过xpath定位,xpath定位有N种写法,这里列几个常用写法
driver.find_element_by_xpath("//input[@id='kw']")
driver.find_element_by_xpath("//input[@name='wd']")
driver.find_element_by_xpath("//input[@class='s_ipt']")
driver.find_element_by_xpath("/html/body/form/span/input")
driver.find_element_by_xpath("//span[@class='soutubtn']/input")
driver.find_element_by_xpath("//form[@id='form']/span/input")
driver.find_element_by_xpath("//input[@id='kw'and@name='wd']")
--------------------------------------------------------------------------
#假设页面上有一组文本链接:
<aclass="mnav"href="http://news.baidu.com"name="tj_trnews">新闻</a>
<aclass="mnav"href="http://www.hao123.com"name="tj_trhao123">hao123</a>--------------------------------------------------------------------------
#通过linktext定位
driver.find_element_by_link_text("新闻")
driver.find_element_by_link_text("hao123")
#通过partiallinktext定位
driver.find_element_by_partial_link_text("新")
driver.find_element_by_partial_link_text("hao")driver.find_element_by_partial_link_text("123")
3.3 节点对象方法
**节点对象常用属性及方法:
node.send_keys():向文本框发送内容
node.click():点击
node.clear():清空文本
node.get_attribute(‘属性名’):获取节点属性值
node.text:获取节点文本内容(包含子节点和后代节点)
3.4 selenium键盘操作
Selenium中的Key模块为我们提供了模拟键盘按键的方法,那就是send_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…Fn) | 键盘 F1…Fn |
3.5 selenium鼠标操作
在 WebDriver 中, 将这些关于鼠标操作的方法封装在 ActionChains 类提供。
方法 | 说明 |
---|---|
ActionChains(driver) | 构造ActionChains对象 |
context_click() | 执行鼠标悬停操作 |
move_to_element(above) | 右击 |
double_click() | 双击 |
drag_and_drop() | 拖动 |
move_to_element(above) | 执行鼠标悬停操作 |
context_click() | 用于模拟鼠标右键操作, 在调用时需要指定元素定位 |
perform() | 执行所有 ActionChains 中存储的行为,可以理解成是对整个操作的 |
使用流程
导入鼠标事件类: from selenium.webdriver import ActionChains
实例化鼠标对象: ActionChains(browser)
指定鼠标行为: move_to_element(node)
执行鼠标行为: perform()
from selenium.webdriver import ActionChains
ActionChains(browser).move_to_element(node).perform()
driver.maximize_window() # 页面最大化
# 2.定位到要悬停的元素
element = driver.find_element_by_xpath('//*[@id="s-usersetting-top"]')
# 3.对定位到的元素执行鼠标悬停操作
ActionChains(driver).move_to_element(to_element=element).perform()
例子:
from selenium.webdriver import ActionChains
from selenium import webdriver
import time
driver = webdriver.Chrome()
driver.maximize_window()
driver.get(url='https://www.baidu.com/')
# 2.定位到要悬停的元素
element = driver.find_element_by_xpath('//*[@id="s-usersetting-top"]')
# 3.对定位到的元素执行鼠标悬停操作
ActionChains(driver).move_to_element(to_element=element).perform()
time.sleep(1)
driver.find_element_by_link_text('高级搜索').click()
time.sleep(5)
driver.quit()
3.6 selenium frame (登录问题)
一般遇到这样的问题,都是需要先进行登录的问题,我们发现网页中居然还嵌套一个网页,我们必
须的先选择内部的网页才能进行其他操作
处理方式
切换到要处理的frame
在frame中定位页面元素并进行操作
返回当前处理的Frame的上一级页面或主页面
常用函数
切换到frame:browser.switch_to.frame(frame节点对象)
返回上一级:browser.switch_to.parent_frame()
返回主页面:browser.switch_to.default_content()
使用步骤
默认支持id和name属性值查找:switch_to.frame(id|name)
先找到frame节点:frame_node = browser.find_element_by_xxx
再切换到frame:browser.switch_to.frame(iframe_node)
3.7 selenium浏览器控制方法
方法 | 说明 |
---|---|
webdriver.set_window_size() | 设置浏览器的大小 |
webdriver.**back() | ** 控制浏览器后退 |
webdriver.forward() | 控制浏览器前进 |
webdriver.refresh() | 刷新当前页面 |
webdriver.clear() | 清除文本 |
webdriver.send_keys(value) | 模拟按键输入 |
webdriver.click() | 单击元素 |
webdriver.submit() | 用于提交表单 |
webdriver.get_attribute(name) | 获取元素属性值 |
webdriver.is_displayed() | 设置该元素是否用户可见 |
webdriver.size | 返回元素的尺寸 |
webdriver.text | 获取元素的文本 |
例子:
from selenium import webdriver
from time import sleep
# 1.创建Chrome浏览器对象,这会在电脑上在打开一个浏览器窗口
driver = webdriver.Chrome()
# 2.通过浏览器向服务器发送URL请求
driver.get("https://www.baidu.com/")
sleep(3)
# 3.刷新浏览器
driver.refresh()
# 4.设置浏览器的大小
driver.set_window_size(1400, 800)
# 5.设置链接内容
element = driver.find_element_by_link_text("新闻")
element.click()
element = driver.find_element_by_link_text("韩国踩踏事故")
element.click()
3.8 获取断言信息
不管是在做功能测试还是自动化测试,最后一步需要拿实际结果与预期进行比较。这个比较的称之
为断言。通过我们获取title 、URL和text等信息进行断言。
属性 | 说明 |
---|---|
title | 用于获得当前页面的标题 |
current_url | 用户获取当前页面的url |
text | 获取搜索条目的文本信息 |
例子:
from selenium import webdriver
from time import sleep
driver = webdriver.Chrome()
driver.get("https://www.baidu.com")
print('Before search================')
# 打印当前页面title
title = driver.title
print(title) # 百度一下,你就知道
# 打印当前页面URL
now_url = driver.current_url
print(now_url) # https://www.baidu.com/
driver.find_element_by_id("kw").send_keys("selenium")
driver.find_element_by_id("su").click()
sleep(1)
print('After search================')
# 再次打印当前页面title
title = driver.title
print(title) # selenium_百度搜索
# 打印当前页面URL
now_url = driver.current_url
print(now_url) # https://www.baidu.com/s?ie=utf-
8&f=8&rsv_bp=0&rsv_idx=1&tn=baidu&wd=selenium&rsv_pq=a1d51b980000e36e&rsv_t=a715
IZaMpLd1w92I4LNUi7gKuOdlAz5McsHe%2FSLQeBZD44OUIPnjY%2B7pODM&rqlang=cn&rsv_enter=
0&rsv_sug3=8&inputT=758&rsv_sug4=759
# 获取结果数目
user = driver.find_element_by_class_name('nums').text
print(user) # 百度为您找到相关结果约7,170,000个
#关闭所有窗口
driver.quit()