Selenium Web网站自动化测试

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']")
  1. 绝对定位 (页面结构轻微调整就会被破坏)

  2. HTML页面中的第一个form元素

  3. 包含 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']")
  1. 第一个form元素中包含name属性并且其值为 username 的input元素

  2. id为 loginForm 的form元素的第一个input子元素

  3. 第一个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]")
  1. Input with attribute named name and the value continue and attribute named type and the value button

  2. Fourth input child element of the form element with attribute named id and value loginForm

这些实例都是一些举出用法, 为了学习更多有用的东西,下面这些参考资料推荐给你:

还有一些非常有用的插件,可以协助发现元素的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')

Sauce 实验室有一篇很好的文档来介绍CSS选择器

以上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() → 无[查看模板]

    清除已存储在本地和远程的操作 结束。

  • clickon_element:WebElement | None = None) → 操作链[查看模板]

    单击元素。参数:on_element:要单击的元素。 如果为 None,则单击当前鼠标位置。

  • click_and_holdon_element:WebElement | None = None) → 操作链[查看模板]

    按住元素上的鼠标左键。参数:on_element:鼠标向下的元素。 如果为 None,则单击当前鼠标位置。

  • context_clickon_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_downvalue: strelement: 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_upvalue: strelement: 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_offsetxoffset: intyoffset: int) → ActionChains[查看模板]

    将鼠标移动到当前鼠标位置的偏移量。参数:xoffset:要移动到 X 偏移量,作为正整数或负整数。yoffset:要移动到 Y 的偏移量,作为正整数或负整数。

  • move_to_element_with_offsetto_element: WebElementxoffset: intyoffset: int) → ActionChains[查看模板]

    将鼠标移动指定元素的偏移量。偏移量为 相对于元素的视图内中心点。参数:to_element:要移动到的 WebElement。xoffset:要移动到 X 偏移量,作为正整数或负整数。yoffset:要移动到 Y 的偏移量,作为正整数或负整数。

  • pauseseconds: float | int) → 行动链[查看模板]

    在指定的持续时间内暂停所有输入(以秒为单位)。

  • releaseon_element:WebElement | None = None) → 操作链[查看模板]

    松开元素上的按住鼠标按钮。参数:on_element:要将鼠标悬停的元素。 如果为 None,则在当前鼠标位置松开。

  • send_keys*keys_to_send: str) → 行动链[查看模板]

    将键发送到当前聚焦的元素。参数:keys_to_send:要发送的密钥。修饰键常量可以在 “Keys”类。

  • send_keys_to_elementelement: WebElement*keys_to_send: str) → ActionChains[查看模板]

    将键发送到元素。参数:element:发送密钥的元素。keys_to_send:要发送的密钥。修饰键常量可以在 “Keys”类。

  • scroll_to_elementelement: WebElement) → ActionChains[查看模板]

    如果元素在视口之外,则滚动 元素添加到视口底部。参数:element:要滚动到视口的元素。

  • scroll_by_amountdelta_x: intdelta_y: int) → ActionChains[查看模板]

    按提供的金额滚动,原点位于左上角 的视口。参数:delta_x:沿 X 轴使用滚轮滚动的距离。负值向左滚动。delta_y:沿 Y 轴使用滚轮滚动的距离。负值向上滚动。

内容概要:本文全面讲述了如何基于Python环境和Selenium WebDriver进行Web UI自动化测试,涵盖自动化测试环境搭建、常见元素定位技巧、Selenium API详细介绍,以及unittest测试框架集成等内容。文档提供了详细的安装步骤(包括Python、Selenium和IDE),解释了常见的自动化测试场景及设计原则,着重讨论了几种主要的页面元素定位手段,探讨了操作浏览器、调整页面大小等多种API应用实例,并引入unittest进行测试流程管理和结果报告生成。文档还提供了实战项目,有助于零基础或有一定基础的学习者逐步构建和强化Web UI自动化测试技能。 适合人群:面向希望踏入Web UI自动化测试领域的开发者和技术人员,特别是具备基本的Python编程基础并希望通过动手实验深入了解自动化测试的人群。 使用场景及目标:旨在帮助初学者建立稳固的基础理论认知,熟练掌握自动化测试工具Selenium的具体使用细节及其核心理念,适用于稳定的长期项目,旨在通过高效自动化测试提升产品质量和开发效率。具体包括环境安装配置,自动化用例编排执行,生成测试报告等方面的实践指导。 其他说明:该资料特别强调实际案例的应用,通过逐步引导读者进行代码练习来加深理解。此外,文中提到的一些注意事项,例如环境验证、错误排除方法等对于新手来说非常宝贵。同时推荐结合其他在线教程或其他教材进行深入学习。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值