1.selenium介绍
- 概述 Selenium是一个用于Web应用程序测试的工具。Selenium测试直接运行在浏览器中,就像真正的用户在操作一样。
- 优势- 开源软件:源代码开放,可根据需要来增加工具的某些功能;- 跨平台:linux、windows、mac;- 多语言:支持Java、Python、C#、JavaScript、Ruby等。
- WebDriver API支持的开发语言- Java- Python- PHP- JavaScript- Perl- Ruby- C#
- Selenium WebDriver原理
#mermaid-svg-m6CK7sIcPuRNxAA2 {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-m6CK7sIcPuRNxAA2 .error-icon{fill:#552222;}#mermaid-svg-m6CK7sIcPuRNxAA2 .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-m6CK7sIcPuRNxAA2 .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-m6CK7sIcPuRNxAA2 .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-m6CK7sIcPuRNxAA2 .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-m6CK7sIcPuRNxAA2 .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-m6CK7sIcPuRNxAA2 .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-m6CK7sIcPuRNxAA2 .marker{fill:#333333;stroke:#333333;}#mermaid-svg-m6CK7sIcPuRNxAA2 .marker.cross{stroke:#333333;}#mermaid-svg-m6CK7sIcPuRNxAA2 svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-m6CK7sIcPuRNxAA2 .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-m6CK7sIcPuRNxAA2 .cluster-label text{fill:#333;}#mermaid-svg-m6CK7sIcPuRNxAA2 .cluster-label span{color:#333;}#mermaid-svg-m6CK7sIcPuRNxAA2 .label text,#mermaid-svg-m6CK7sIcPuRNxAA2 span{fill:#333;color:#333;}#mermaid-svg-m6CK7sIcPuRNxAA2 .node rect,#mermaid-svg-m6CK7sIcPuRNxAA2 .node circle,#mermaid-svg-m6CK7sIcPuRNxAA2 .node ellipse,#mermaid-svg-m6CK7sIcPuRNxAA2 .node polygon,#mermaid-svg-m6CK7sIcPuRNxAA2 .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-m6CK7sIcPuRNxAA2 .node .label{text-align:center;}#mermaid-svg-m6CK7sIcPuRNxAA2 .node.clickable{cursor:pointer;}#mermaid-svg-m6CK7sIcPuRNxAA2 .arrowheadPath{fill:#333333;}#mermaid-svg-m6CK7sIcPuRNxAA2 .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-m6CK7sIcPuRNxAA2 .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-m6CK7sIcPuRNxAA2 .edgeLabel{background-color:#e8e8e8;text-align:center;}#mermaid-svg-m6CK7sIcPuRNxAA2 .edgeLabel rect{opacity:0.5;background-color:#e8e8e8;fill:#e8e8e8;}#mermaid-svg-m6CK7sIcPuRNxAA2 .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-m6CK7sIcPuRNxAA2 .cluster text{fill:#333;}#mermaid-svg-m6CK7sIcPuRNxAA2 .cluster span{color:#333;}#mermaid-svg-m6CK7sIcPuRNxAA2 div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-m6CK7sIcPuRNxAA2 :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;}
Request
Response
脚本
Browser Drivers
Browsers
- 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等。
2.环境搭建–Selenium及相关软件安装配置
- 基于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/- Microsoft Edge WebDriver: https://developer.microsoft.com/en-us/microsoft-edge/tools/webdriver/
- 浏览器版本、WebDriver版本、Selenium版本要匹配。
3.selenium的基本使用
3.1 入门案例
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()
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
<inputtype="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)# <input type="text" class="s_ipt" name="wd" id="kw" maxlength="100" autocomplete="off"># 通过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')# <input type="submit" id="su" value="百度一下" class="bg s_btn"># 通过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
<ahref="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)# <a href="http://news.baidu.com" target="_blank" class="mnav c-font-normal c-color-t">新闻</a># 精确查找-->完整关键字查找-->通过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”的所有元素**选择所有元素elementp选择所有元素element,elementdiv,p选择所有
元素和元素element elementdiv p选择所有
元素内部的全部元素element>elementdiv>p选择父元素为
元素的所有元素element+elementdiv+p选择紧接在
元素之后的所有元素[attribute][target]选择带有target属性的所有元素[attribute=value][target=_blank]选择target=“_blank”的所有元素
css选择器参考手册:https://www.w3school.com.cn/cssref/css_selectors.asp对于一段html
<inputid="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)# <input type="text" class="s_ipt" name="wd" id="kw" maxlength="100" autocomplete="off"># 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()
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:\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()
3.4 浏览器的基本操作
- 浏览器操作方法 - maximize_window():窗口最大化- set_window_size(width, height):设置窗口宽高(单位为像素)- set_window_position(x,y):设置窗口位置,浏览器窗口左上角相对于屏幕左上角的位置- back():后退- forward():前进- refresh():刷新页面- close():关闭当前页面- quit():关闭浏览器
- 浏览器信息(属性) - title:获取页面标题- current_url:获取当前页面的url地址
3.5 页面等待
3.5.1 显式等待
- 操作步骤 - 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:\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()
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:\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()
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:\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()
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:\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()
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:\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()
参考文章:
本文转载自: https://blog.csdn.net/username666/article/details/126236901
版权归原作者 梦里逆天 所有, 如有侵权,请联系我们删除。发表评论
“python Web自动化之Selenium的基本使用”的评论:
还没有评论