-
概述
Selenium是一个用于Web应用程序测试的工具。Selenium测试直接运行在浏览器中,就像真正的用户在操作一样。 -
优势
- 开源软件:源代码开放,可根据需要来增加工具的某些功能;
- 跨平台:linux、windows、mac;
- 多语言:支持Java、Python、C#、JavaScript、Ruby等。
-
WebDriver API支持的开发语言
- Java
- Python
- PHP
- JavaScript
- Perl
- Ruby
- C#
-
Selenium WebDriver原理
2.环境搭建–Selenium及相关软件安装配置
- Selenium Client Library
- Selenium自动化测试人员可以使用Java、Ruby、Python、C#等语言,利用它们提供的库来编写脚本。
- JSON Wire Protocol Over HTTP Client
- JSON Wire Protocol是在HTTP服务器之间传输信息的REST风格的API。每个浏览器驱动程序(如FirefoxDriver、ChromeDriver等)都有它们各自的HTTP服务器。
- Browser Drivers
- 不同的浏览器都包含一个单独的浏览器驱动程序。浏览器驱动程序与相应的浏览器通信。当浏览器驱动程序接收到指令后,将在相应的浏览器中执行,相应信息以HTTP的形式返回。
- Browsers
- Selenium支持多种浏览器,如Firefox、Chrome、IE、Safari、Opera、Edge等。
-
基于Python环境搭建(Windows系统)
- Python 3.7
- 安装PyCharm
- 安装selenium包
- 浏览器,如Chrome谷歌浏览器
-
selenium安装、卸载及查看命令
- 安装
pip install selenium
- 卸载
pip uninstall selenium
- 查看
pip show selenium
-
WebDriver下载
- 官方下载
http://www.seleniumhq.org/download/ - 国内镜像
- ChromeWebDriver:
https://npm.taobao.org/mirrors/chromedriver/
https://chromedriver.storage.googleapis.com/index.html - FireFoxWebDriver:
https://npm.taobao.org/mirrors/geckodriver/
- ChromeWebDriver:
- 官方下载
-
浏览器版本、WebDriver版本、Selenium版本要匹配。
from selenium import webdriver from time import sleep # 1.创建WebDriver对象 # 如果将驱动添加到了系统环境变量目录中,可不带参数 # driver = webdriver.Chrome() # 如果没有添加到系统环境变量目录中,需要通过参数指定 from selenium.webdriver.chrome.service import Service # DeprecationWarning: executable_path has been deprecated, please pass in a Service object # https://www.likecs.com/ask-1641032.html service = Service(r"D:softwarechromedriver.exe") driver = webdriver.Chrome(service=service) # 2.url请求地址 url = 'https://www.baidu.com' # 使用浏览器打开指定页面 # 3.发送请求 driver.get(url) # 4.睡眠3秒 sleep(3) # 5.关闭驱动对象 driver.close()3.2 元素查找
可通过webDriver的By方法获取元素。
from selenium.webdriver.common.by import By # def find_element(self, by=By.ID, value=None) # def find_elements(self, by=By.ID, value=None)
支持参数包含:
- ID
- CLASS_NAME
- NAME
- TAG_NAME
- CSS_SELECtOR
- XPATH
- LINK_TEXT
- PARTIAL_LINK_TEXT
对于一段html
如下代码可以获取到这个标签:
# 通过id定位元素 driver.find_element(by=By.ID, value='kw') # 通过name定位元素 driver.find_element(by=By.NAME, value='wd') # 通过class_name定位元素 driver.find_element(by=By.CLASS_NAME, value='s_ipt') # 通过tag_name标签名定位元素 driver.find_element(by=By.TAG_NAME, value='input')
- 示例
from selenium import webdriver
from time import sleep
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
# 1.创建WebDriver对象
service = Service(r"D:softwarechromedriver.exe")
driver = webdriver.Chrome(service=service)
# 2.url请求地址
url = 'https://www.baidu.com'
# 3.发送请求
driver.get(url)
#
# 通过id定位元素,send_keys()在输入框中输入内容
driver.find_element(by=By.ID, value='kw').send_keys('python')
# 通过name定位元素
# driver.find_element(by=By.NAME, value='wd')
# 通过class_name定位元素
# driver.find_element(by=By.CLASS_NAME, value='s_ipt')
# 通过tag_name标签名定位元素
# driver.find_element(by=By.TAG_NAME, value='input')
#
# 通过id定位元素,click方法进行点击操作
driver.find_element(by=By.ID, value='su').click()
# 4.睡眠3秒
sleep(3)
# 5.关闭驱动对象
driver.close()
-
超链接(a标签)
- link_text
- partial_link_text
- 如果使用相同的规则匹配到多个标签,这些方法只返回第一个匹配到的标签
对于一段html
新闻
如下代码都可以访问到这个标签
# 精确查找-->完整关键字查找-->通过link_text定位元素 driver.find_element(by=By.LINK_TEXT, value='新闻').click() # 模糊查找-->部分关键字查找-->通过partial_link_text定位元素 driver.find_element(by=By.PARTIAL_LINK_TEXT, value='新').click()
- 示例
from selenium import webdriver from time import sleep from selenium.webdriver.chrome.service import Service from selenium.webdriver.common.by import By # 1.创建WebDriver对象 service = Service(r"D:softwarechromedriver.exe") driver = webdriver.Chrome(service=service) # 2.url请求地址 url = 'https://www.baidu.com' # 使用浏览器打开指定页面 # 3.发送请求 driver.get(url) # 新闻 # 精确查找-->完整关键字查找-->通过link_text定位元素,click方法进行点击操作 driver.find_element(by=By.LINK_TEXT, value='新闻').click() # 模糊查找-->部分关键字查找-->通过partial_link_text定位元素 driver.find_element(by=By.PARTIAL_LINK_TEXT, value='新').click() # 4.睡眠3秒 sleep(3) # 5.关闭驱动对象 driver.close()
- css选择器语法
| 选择器 | 示例 | 描述 |
|---|---|---|
| class | .intro | 选择class=“intro”的所有元素 |
| #id | #firstname | 选择id=“firstname”的所有元素 |
| * | * | 选择所有元素 |
| element | p | 选择所有 元素 |
| element,element | div,p | 选择所有元素和 元素 |
| element element | div p | 选择所有元素内部的全部 元素 |
| element>element | div>p | 选择父元素为元素的所有 元素 |
| element+element | div+p | 选择紧接在元素之后的所有 元素 |
| [attribute] | [target] | 选择带有target属性的所有元素 |
| [attribute=value] | [target=_blank] | 选择target=“_blank”的所有元素 |
css选择器参考手册:https://www.w3school.com.cn/cssref/css_selectors.asp
对于一段html
如下代码都可以获取到这个标签
# id选择器 driver.find_element(by=By.CSS_SELECTOR, value='#username_id') # 属性选择器 driver.find_element(by=By.CSS_SELECTOR, value='[name=username]') # 类选择器 driver.find_element(by=By.CSS_SELECTOR, value='.red') # 标签选择器 driver.find_element(by=By.CSS_SELECTOR, value='input')
- 示例
from selenium import webdriver from time import sleep from selenium.webdriver.chrome.service import Service from selenium.webdriver.common.by import By # 1.创建WebDriver对象 service = Service(r"D:softwarechromedriver.exe") driver = webdriver.Chrome(service=service) # 2.url请求地址 url = 'https://www.baidu.com' # 3.发送请求 driver.get(url) # # id选择器 el1 = driver.find_element(by=By.CSS_SELECtOR, value='#kw') print(el1) # 属性选择器 el2 = driver.find_element(by=By.CSS_SELECTOR, value='[name=wd]') print(el2) # 类选择器 el3 = driver.find_element(by=By.CSS_SELECTOR, value='.s_ipt') print(el3) # 标签选择器 el4 = driver.find_element(by=By.CSS_SELECTOR, value='input') print(el4) # 4.睡眠3秒 sleep(3) # 5.关闭驱动对象 driver.close()
-
xpath概念
xpath(XML Path Language),即XML路径语言,可用来在XML文档中对元素和属性进行遍历。XML和HTML一样,是标记语言,通过标签的嵌套来表达信息。多重嵌套,形成了父节点、子节点等关系,xpath就是用来在这些节点中找到需要的数据。通过Chrome的调试工具(F12打开),可获得特定的xpath(Elements–>选中元素–>右键–>Copy–>Copy XPath)。 -
xpath表达式
-
选取节点
表达式 描述 nodename 选取此节点的所有子节点。 / 从根节点选取。 // 从匹配选择的当前节点选择文档中的节点,而不考虑它们的位置。 . 选取当前节点。 … 选取当前节点的父节点。 @ 选取属性。 -
示例
路径表达式 结果 bookstore 选取 bookstore 元素的所有子节点。 /bookstore 选取根元素 bookstore。注释:假如路径起始于正斜杠( / ),则此路径始终代表到某元素的绝对路径! bookstore/book 选取属于 bookstore 的子元素的所有 book 元素。 //book 选取所有 book 子元素,而不管它们在文档中的位置。 bookstore//book 选择属于 bookstore 元素的后代的所有 book 元素,而不管它们位于 bookstore 之下的什么位置。 //@lang 选取名为 lang 的所有属性。
-
-
获取内容
表达式 描述 @ 选取属性 text() 获取文本内容
参考:https://www.w3school.com.cn/xpath/xpath_syntax.asp
-
from selenium import webdriver
from time import sleep
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
# 1.创建WebDriver对象
# 如果将驱动添加到了系统环境变量目录中,可不带参数
# driver = webdriver.Chrome()
# 如果没有添加到系统环境变量目录中,需要通过参数指定
service = Service(r"D:softwarechromedriver.exe")
driver = webdriver.Chrome(service=service)
# 2.url请求地址
url = 'https://www.baidu.com'
# 3.发送请求
driver.get(url)
driver.find_element(by=By.XPATH, value='//*[@id="kw"]').send_keys('李白')
driver.find_element(by=By.XPATH, value='//*[@id="su"]').click()
# 4.睡眠
sleep(5)
# 5.关闭驱动对象
driver.close()
3.3 元素的其他操作
- 元素操作
- clear():清除文本
- send_keys():模拟输入
- click():单击元素
- 获取属性元素
- size:返回元素大小
- text:获取元素文本内容
- get_attribute():获取属性值
- is_display():判断元素是否可见
- is_enabled():判断元素是否可用
from selenium import webdriver
from time import sleep
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
# 1.创建WebDriver对象
service = Service(r"D:softwarechromedriver.exe")
driver = webdriver.Chrome(service=service)
# 2.url请求地址
url = 'https://www.baidu.com'
# 3.发送请求
driver.get(url)
el1 = driver.find_element(by=By.XPATH, value='//*[@id="kw"]')
el1.send_keys('疾风剑豪')
sleep(2)
# 清除文本
el1.clear()
# driver.find_element(by=By.XPATH, value='//*[@id="su"]').click()
# 获取元素尺寸大小
print(el1.size)
# 获取文本内容
print(el1.text)
# 获取属性值
print(el1.get_attribute('class'))
# 查看是否可用(是否可点击)
print(el1.is_enabled())
# 查看元素是否显示
print(el1.is_displayed())
# 查看元素是否选中
print(el1.is_selected())
# 4.睡眠
sleep(5)
# 5.关闭驱动对象
driver.close()
3.4 浏览器的基本操作
- 浏览器操作方法
- maximize_window():窗口最大化
- set_window_size(width, height):设置窗口宽高(单位为像素)
- set_window_position(x,y):设置窗口位置,浏览器窗口左上角相对于屏幕左上角的位置
- back():后退
- forward():前进
- refresh():刷新页面
- close():关闭当前页面
- quit():关闭浏览器
- 浏览器信息(属性)
- title:获取页面标题
- current_url:获取当前页面的url地址
- 操作步骤
- 1.使用WebDriverWait包装webDriver对象
- 2.使用webDriverWait的util方法,传入可调用对象(一般是presence_of_element_locate函数的返回值)
- 每隔一段时间不断尝试查找元素,找到了就返回。如果超过指定时间还没找到就报错。
- 示例:
import time from selenium import webdriver from selenium.webdriver.chrome.service import Service from selenium.webdriver.common.by import By from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.support.wait import WebDriverWait # 1.创建WebDriver对象 service = Service(r"D:softwarechromedriver.exe") driver = webdriver.Chrome(service=service) # 2.url请求地址 url = 'https://hanyu.baidu.com/shici/detail?pid=3bae8ab343d84e359bea52e48db609d2&from=kg0' # 3.发送请求 driver.get(url) # 显式等待 el1 = WebDriverWait(driver, 3).until(EC.presence_of_element_located((By.ID, 'poem-detail-header'))) print(el1) # 4.睡眠 time.sleep(5) # 5.关闭驱动对象 driver.close()3.5.2 隐式等待
- 操作步骤
在创建好webDriver对象之后,调用implicitly_wait()方法传入超时时间即可 - 原理
- 元素在第一次就定位到则不会触发隐式等待时长。
- 如果定位某一元素失败,就会触发隐式等待有效时长。
- 如果在指定时间内加载完毕,则继续执行。否则,抛出NoSuchElementException异常。
- 示例
import time from selenium import webdriver from selenium.webdriver.chrome.service import Service from selenium.webdriver.common.by import By # 1.创建WebDriver对象 service = Service(r"D:softwarechromedriver.exe") driver = webdriver.Chrome(service=service) # 隐式等待 driver.implicitly_wait(5) # 2.url请求地址 url = 'https://hanyu.baidu.com/shici/detail?pid=3bae8ab343d84e359bea52e48db609d2&from=kg0' # 3.发送请求 driver.get(url) el1 = driver.find_element(By.ID, 'poem-detail-header') print(el1) # 4.睡眠 time.sleep(5) # 5.关闭驱动对象 driver.close()3.6 鼠标操作
selenium可以模拟鼠标操作
-
操作步骤
- 创建ActionChains对象
- 使用ActionChains对象的方法,进行操作
- context_click():右击,模拟鼠标右击效果
- double_click():双击,模拟鼠标双击
- drag_and_drop():拖动,模拟鼠标拖动
- move_to_element():悬停,模拟鼠标悬停效果
- 其他:参考ActionChains源码
- 通过ActionChains提交这些操作:perform()执行
-
示例
- 拖动
from selenium import webdriver from time import sleep from selenium.webdriver import ActionChains from selenium.webdriver.chrome.service import Service from selenium.webdriver.common.by import By # 1.创建WebDriver对象 service = Service(r"D:softwarechromedriver.exe") driver = webdriver.Chrome(service=service) # 2.url请求地址 url = 'https://www.baidu.com' # 3.发送请求 driver.get(url) driver.maximize_window() sleep(1) el1 = driver.find_element(by=By.XPATH, value='//*[@id="kw"]') # 创建一个事件链对象 chains = ActionChains(driver) el2 = driver.find_element(by=By.XPATH, value='//*[@id="form"]/span[1]') chains.drag_and_drop(el2, el1) # 事件提交 chains.perform() # 4.睡眠3秒 sleep(3) # 5.关闭驱动对象 driver.close()
- 移动鼠标
import time from selenium import webdriver from selenium.webdriver import ActionChains from selenium.webdriver.chrome.service import Service from selenium.webdriver.common.by import By # 1.创建WebDriver对象 service = Service(r"D:softwarechromedriver.exe") driver = webdriver.Chrome(service=service) # 2.url请求地址 url = 'https://www.baidu.com' # 3.发送请求 driver.get(url) driver.maximize_window() time.sleep(1) # 创建一个事件链对象 chains = ActionChains(driver) el1 = driver.find_element(by=By.XPATH, value='//*[@id="s-top-left"]/div/a') chains.move_to_element(el1) # 事件提交 chains.perform() # 4.睡眠3秒 time.sleep(3) # 5.关闭驱动对象 driver.close() driver.quit()3.7 键盘操作
- 方法
element_send_keys() - 参数
- 普通字符串
- 键盘按键
- 示例
"""
要求
1.输入文本:将进酒李白,暂停3秒,删除“李白”
2.全选文本:将进酒
3.剪切:将进酒,暂停3秒
4.粘贴到输入框,点击搜索
"""
import time
from selenium import webdriver
from selenium.webdriver import Keys
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
# 1.创建WebDriver对象
service = Service(r"D:softwarechromedriver.exe")
driver = webdriver.Chrome(service=service)
# 2.url请求地址
url = 'https://www.baidu.com'
# 3.发送请求
driver.get(url)
# 定位输入框
el1 = driver.find_element(by=By.XPATH, value='//*[@id="kw"]')
# 输入文本
el1.send_keys('将进酒李白')
time.sleep(3)
# 删除“李白”
el1.send_keys(Keys.BACK_SPACE*2)
# 全选
el1.send_keys(Keys.CONTROL, 'a')
# 剪切
el1.send_keys(Keys.CONTROL, 'x')
time.sleep(3)
# 复制
# el1.send_keys(Keys.CONTROL, 'c')
# 粘贴
el1.send_keys(Keys.CONTROL, 'v')
# 点击搜索
driver.find_element(by=By.XPATH, value='//*[@id="su"]').click()
# 4.睡眠
time.sleep(5)
# 5.关闭驱动对象
driver.close()
3.8 页面滚动
WebDriver类库中提供了可调用JavaScript脚本的方法,可以通过JavaScript脚本来达到操作滚动条的目的。
- 方法
- 让浏览器执行js代码:driver.execute_script(js代码字符串)
- 滚动的js代码
- 绝对滚动:window.scrollTo(x,y)
- 相对滚动:window.scrollBy(x,y)
import time from selenium import webdriver from selenium.webdriver.chrome.service import Service # 1.创建WebDriver对象 service = Service(r"D:softwarechromedriver.exe") driver = webdriver.Chrome(service=service) # 2.url请求地址 url = 'https://www.baidu.com' # 3.发送请求 driver.get(url) driver.maximize_window() time.sleep(2) # 绝对滚动 js_str = "window.scrollTo(1920,1080)" driver.execute_script(js_str) # 4.睡眠 time.sleep(5) # 5.关闭驱动对象 driver.close()
参考文章:
- https://www.likecs.com/ask-1641032.html
- css选择器参考手册:https://www.w3school.com.cn/cssref/css_selectors.asp
- XPath参考:https://www.w3school.com.cn/xpath/xpath_syntax.asp



