概述
Selenium是一个用于Web应用程序测试的工具。Selenium测试直接运行在浏览器中,就像真正的用户在操作一样。
优势
WebDriver API支持的开发语言
Selenium WebDriver原理
- 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系统)
selenium安装、卸载及查看命令
pip install selenium
pip uninstall selenium
pip show selenium
WebDriver下载
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:\software\chromedriver.exe")
driver = webdriver.Chrome(service=service)
# 2.url请求地址
url = 'https://www.baidu.com'
# 使用浏览器打开指定页面
# 3.发送请求
driver.get(url)
# 4.睡眠3秒
sleep(3)
# 5.关闭驱动对象
driver.close()
可通过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)
支持参数包含:
对于一段html
<input type="text" class="s_ipt" name="wd" id="kw" maxlength="100" autocomplete="off">
如下代码可以获取到这个标签:
# 通过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:\software\chromedriver.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标签)
对于一段html
<a href="http://news.baidu.com" target="_blank" class="mnav c-font-normal c-color-t">新闻a>
如下代码都可以访问到这个标签
# 精确查找-->完整关键字查找-->通过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:\software\chromedriver.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()
选择器 | 示例 | 描述 |
---|---|---|
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
<input id="username_id" type="text" name="username" class="red">
如下代码都可以获取到这个标签
# 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:\software\chromedriver.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:\software\chromedriver.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()
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:\software\chromedriver.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()
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:\software\chromedriver.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()
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:\software\chromedriver.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()
selenium可以模拟鼠标操作
操作步骤
示例
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:\software\chromedriver.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:\software\chromedriver.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()
"""
要求
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:\software\chromedriver.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()
WebDriver类库中提供了可调用JavaScript脚本的方法,可以通过JavaScript脚本来达到操作滚动条的目的。
import time
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
# 1.创建WebDriver对象
service = Service(r"D:\software\chromedriver.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()