Selenium是一套Web网站程序自动化测试方案
一、环境搭建
1,安装Selenium库
不同的编程语言选择不同的Selenium客户端库对应我们Python语言来说,Selenium客户端库的安装非常简单,用 pip 命令即可打开 命令行程序,运行如下命令 pip install selenium 如果安装不了,可能是网络问题,可以指定使用国内的豆瓣源 pip install selenium -i https://pypi.douban.com/simple/
pycharm可以打开终端安装
确认安装使用命令
pip show selenium
2,安装对应的浏览器和浏览器驱动
因为我的电脑自带MicrosoftEdge浏览器所以我用的是它的驱动,接下来演示如何下载MircsoftEdge驱动
双击Edge浏览器点击如图所示
选择帮助和反馈,选择关于Edge
记住版本
下载Edge驱动Microsoft Edge WebDriver |Microsoft Edge 开发人员
驱动解压之后会得到如下文件
将这个文件拷贝到python解释器下面
在python中可以用如下代码验证
import time from selenium import webdriver from selenium.webdriver.common.keys import Keys from selenium.webdriver.edge.service import Service browser = webdriver.Edge() browser.get("http://www.baidu.com") time.sleep(10)
用Edge打开baidu10秒后关闭
二、定位元素
以百度首页面为参考
进入首页面右键,选择检查
点击如下图标
选中你需要定位的地方
右侧会选中对应代码,右键复制就可以得到相应信息
代码中通过find_element()方法来定位页面元素
示例代码
需要引入
from selenium.webdriver.common.by import By element = driver.find_element(By.ID, 'foo')
除了ID官方还提供了如下方案
ID = "id" XPATH = "xpath" LINK_TEXT = "link text" PARTIAL_LINK_TEXT = "partial link text" NAME = "name" TAG_NAME = "tag name" CLASS_NAME = "class name" CSS_SELECTOR = "css selector"
1. 通过ID查找元素
当你知道一个元素的 id 时,你可以使用本方法。在该策略下,页面中第一个该 id 元素 会被匹配并返回。如果找不到任何元素,会抛出 NoSuchElementException
异常。
作为示例,页面元素如下所示:
<html> <body> <form id="loginForm"> <input name="username" type="text" /> <input name="password" type="password" /> <input name="continue" type="submit" value="Login" /> </form> </body> <html>
可以这样查找表单(form)元素:
login_form = driver.find_element_by_id('loginForm')
2. 通过Name查找元素
当你知道一个元素的 name 时,你可以使用本方法。在该策略下,页面中第一个该 name 元素 会被匹配并返回。如果找不到任何元素,会抛出 NoSuchElementException
异常。
作为示例,页面元素如下所示:
<html> <body> <form id="loginForm"> <input name="username" type="text" /> <input name="password" type="password" /> <input name="continue" type="submit" value="Login" /> <input name="continue" type="button" value="Clear" /> </form> </body> <html>
name属性为 username & password 的元素可以像下面这样查找:
username = driver.find_element_by_name('username') password = driver.find_element_by_name('password')
这会得到 “Login” 按钮,因为他在 “Clear” 按钮之前:
continue = driver.find_element_by_name('continue')
3. 通过XPath查找元素
XPath是XML文档中查找结点的语法。因为HTML文档也可以被转换成XML(XHTML)文档, Selenium的用户可以利用这种强大的语言在web应用中查找元素。 XPath扩展了(当然也支持)这种通过id或name属性获取元素的简单方式,同时也开辟了各种新的可能性, 例如获取页面上的第三个复选框。
使用XPath的主要原因之一就是当你想获取一个既没有id属性也没有name属性的元素时, 你可以通过XPath使用元素的绝对位置来获取他(这是不推荐的),或相对于有一个id或name属性的元素 (理论上的父元素)的来获取你想要的元素。XPath定位器也可以通过非id和name属性查找元素。
绝对的XPath是所有元素都从根元素的位置(HTML)开始定位,只要应用中有轻微的调整,会就导致你的定位失败。 但是通过就近的包含id或者name属性的元素出发定位你的元素,这样相对关系就很靠谱, 因为这种位置关系很少改变,所以可以使你的测试更加强大。
作为示例,页面元素如下所示:
<html> <body> <form id="loginForm"> <input name="username" type="text" /> <input name="password" type="password" /> <input name="continue" type="submit" value="Login" /> <input name="continue" type="button" value="Clear" /> </form> </body> <html>
可以这样查找表单(form)元素:
login_form = driver.find_element_by_xpath("/html/body/form[1]") login_form = driver.find_element_by_xpath("//form[1]") login_form = driver.find_element_by_xpath("//form[@id='loginForm']")
-
绝对定位 (页面结构轻微调整就会被破坏)
-
HTML页面中的第一个form元素
-
包含 id 属性并且其值为 loginForm 的form元素
username元素可以如下获取:
username = driver.find_element_by_xpath("//form[input/@name='username']") username = driver.find_element_by_xpath("//form[@id='loginForm']/input[1]") username = driver.find_element_by_xpath("//input[@name='username']")
-
第一个form元素中包含name属性并且其值为 username 的input元素
-
id为 loginForm 的form元素的第一个input子元素
-
第一个name属性为 username 的input元素
“Clear” 按钮可以如下获取:
clear_button = driver.find_element_by_xpath("//input[@name='continue'][@type='button']") clear_button = driver.find_element_by_xpath("//form[@id='loginForm']/input[4]")
-
Input with attribute named name and the value continue and attribute named type and the value button
-
Fourth input child element of the form element with attribute named id and value loginForm
这些实例都是一些举出用法, 为了学习更多有用的东西,下面这些参考资料推荐给你:
-
XPath Tutorial - with interactive examples.
还有一些非常有用的插件,可以协助发现元素的XPath:
-
XPath Checker - suggests XPath and can be used to test XPath results.
-
Firebug - XPath suggestions are just one of the many powerful features of this very useful add-on.
-
XPath Helper - for Google Chrome
4. 通过链接文本获取超链接
当你知道在一个锚标签中使用的链接文本时使用这个。 在该策略下,页面中第一个匹配链接内容锚标签 会被匹配并返回。如果找不到任何元素,会抛出 NoSuchElementException
异常。
作为示例,页面元素如下所示:
<html> <body> <p>Are you sure you want to do this?</p> <a href="continue.html">Continue</a> <a href="cancel.html">Cancel</a> </body> <html>
continue.html 超链接可以被这样查找到:
continue_link = driver.find_element_by_link_text('Continue') continue_link = driver.find_element_by_partial_link_text('Conti')
5. 通过标签名查找元素
当你向通过标签名查找元素时使用这个。 在该策略下,页面中第一个匹配该标签名的元素 会被匹配并返回。如果找不到任何元素,会抛出 NoSuchElementException
异常。
作为示例,页面元素如下所示:
<html> <body> <h1>Welcome</h1> <p>Site content goes here.</p> </body> <html>
h1 元素可以如下查找:
heading1 = driver.find_element_by_tag_name('h1')
6. 通过Class name 定位元素
当你向通过class name查找元素时使用这个。 在该策略下,页面中第一个匹配该class属性的元素 会被匹配并返回。如果找不到任何元素,会抛出 NoSuchElementException
异常。
作为示例,页面元素如下所示:
<html> <body> <p class="content">Site content goes here.</p> </body> <html>
p 元素可以如下查找:
content = driver.find_element_by_class_name('content')
7. 通过CSS选择器查找元素
当你向通过CSS选择器查找元素时使用这个。 在该策略下,页面中第一个匹配该CSS 选择器的元素 会被匹配并返回。如果找不到任何元素,会抛出 NoSuchElementException
异常。
作为示例,页面元素如下所示:
<html> <body> <p class="content">Site content goes here.</p> </body> <html>
p 元素可以如下查找:
content = driver.find_element_by_css_selector('p.content')
以上7小点内容均来自官方文档
有感兴趣的可以自行查看4. 查找元素 — Selenium-Python中文文档 2 documentation (selenium-python-zh.readthedocs.io)
三、操作元素
所有元素操作的对象都是WebElement
1,点击操作
webelement.click()
点击的位置是所选元素的中心点
2,输入操作
send_keys()
文本框输入操作
清除输入框内容
click()方法
3,获取元素属性
get_attribute()
4,等待元素出现
有两种方法
time.sleep()显示等待
implicitly_wait()隐示等待(在WebDriver对象中)
5,iframe或frame中嵌套html
iframe嵌套元素会导致定位之后无法选中的问题
6,切换浏览器窗口
切换回原来的窗口
将切换前的句柄保存下来,需要切换回去的时候直接传入switch_to.window()即可
7,其他高级的元素操作方法
ActionChains 是一种自动执行低级交互(如鼠标)的方法 移动、鼠标按钮操作、按键和上下文菜单交互。 这对于执行更复杂的操作(例如悬停和拖动)很有用 落。
创建新的 ActionChains。
-
参数:
driver:执行用户操作的 WebDriver 实例。持续时间:覆盖 PointerInput 中默认的 250 毫秒DEFAULT_MOVE_DURATION
-
perform() → 无[查看模板]
执行所有存储的操作。
-
reset_actions() → 无[查看模板]
清除已存储在本地和远程的操作 结束。
-
click(on_element:WebElement | None = None) → 操作链[查看模板]
单击元素。参数:on_element:要单击的元素。 如果为 None,则单击当前鼠标位置。
-
click_and_hold(on_element:WebElement | None = None) → 操作链[查看模板]
按住元素上的鼠标左键。参数:on_element:鼠标向下的元素。 如果为 None,则单击当前鼠标位置。
-
context_click(on_element:WebElement | None = None) → 操作链[查看模板]
对元素执行上下文单击(右键单击)。参数:on_element:要进行上下文单击的元素。 如果为 None,则单击当前鼠标位置。
-
double_click*(on_element:WebElement | None = None*) → 操作链[查看模板]
双击元素。参数:on_element:要双击的元素。 如果为 None,则单击当前鼠标位置。
-
drag_and_drop(源代码:WebElement,目标:WebElement) → ActionChains[查看模板]
按住源元素上的鼠标左键,然后移动 添加到目标元素并释放鼠标按钮。参数:source:鼠标向下的元素。target:鼠标向上的元素。
-
drag_and_drop_by_offset(源代码:WebElement,xoffset**:int,yoffset :int)→ ActionChains[查看模板]
按住源元素上的鼠标左键,然后移动 到目标偏移量并释放鼠标按钮。参数:source:鼠标向下的元素。xoffset:要移动到 X 的偏移量。yoffset:要移动到 Y 的偏移量。
-
key_down(value: str, element: WebElement | None = None) → ActionChains[查看模板]
仅发送按键,而不松开。只能使用 使用修饰键(Control、Alt 和 Shift)。参数:value:要发送的修饰键。值在 Keys 类中定义。element:发送密钥的元素。 如果为 None,则向当前聚焦元素发送键。示例,按 ctrl+c:
ActionChains(driver).key_down(Keys.CONTROL).send_keys('c').key_up(Keys.CONTROL).perform()
-
key_up(value: str, element: WebElement | None = None) → ActionChains[查看模板]
释放修饰键。参数:value:要发送的修饰键。值在 Keys 类中定义。element:发送密钥的元素。 如果为 None,则向当前聚焦元素发送键。示例,按 ctrl+c:
ActionChains(driver).key_down(Keys.CONTROL).send_keys('c').key_up(Keys.CONTROL).perform()
-
move_by_offset(xoffset: int, yoffset: int) → ActionChains[查看模板]
将鼠标移动到当前鼠标位置的偏移量。参数:xoffset:要移动到 X 偏移量,作为正整数或负整数。yoffset:要移动到 Y 的偏移量,作为正整数或负整数。
-
move_to_element(to_element:WebElement) → ActionChains[查看模板]
将鼠标移动到元素的中间。参数:to_element:要移动到的 WebElement。
-
move_to_element_with_offset(to_element: WebElement, xoffset: int, yoffset: int) → ActionChains[查看模板]
将鼠标移动指定元素的偏移量。偏移量为 相对于元素的视图内中心点。参数:to_element:要移动到的 WebElement。xoffset:要移动到 X 偏移量,作为正整数或负整数。yoffset:要移动到 Y 的偏移量,作为正整数或负整数。
-
release(on_element:WebElement | None = None) → 操作链[查看模板]
松开元素上的按住鼠标按钮。参数:on_element:要将鼠标悬停的元素。 如果为 None,则在当前鼠标位置松开。
-
send_keys_to_element(element: WebElement, *keys_to_send: str) → ActionChains[查看模板]
将键发送到元素。参数:element:发送密钥的元素。keys_to_send:要发送的密钥。修饰键常量可以在 “Keys”类。
-
scroll_to_element(element: WebElement) → ActionChains[查看模板]
如果元素在视口之外,则滚动 元素添加到视口底部。参数:element:要滚动到视口的元素。
-
scroll_by_amount(delta_x: int, delta_y: int) → ActionChains[查看模板]¶
按提供的金额滚动,原点位于左上角 的视口。参数:delta_x:沿 X 轴使用滚轮滚动的距离。负值向左滚动。delta_y:沿 Y 轴使用滚轮滚动的距离。负值向上滚动。