自动化测试之Python+selenium

  • Selenium

1、什么是自动化测试?

通俗定义:编程测试,编写一段程序来测试另外一个程序,即将测试任务交给计算机来完成。
广义定义:所有需要借助于工具进行辅助测试的方法,都可以称之为自动化测试。

2、为什么要做自动化测试?

1)较少手工测试中重复性工作
2)提高测试用例的执行效率 996 可以使用自动化测试来空闲利用起来
3)一定程度上节省了企业的人力成本
4)可用于大量测试数据的生成 200M
5)可用于完成手工测试很难实现的一些测试场景,比如:多用户操作
12306 Loadrunner\jmeter

3、自动化测试的分类

1)功能自动化测试 使用到的工具有:QTP、selenium、TW
2)性能自动化测试 使用到的工具有:Loadrunner、jmeter、Locust

4、自动化测试的优缺点

优点:
1)效率高
2)快速
3)可重复性
4)可以执行一些手工测试很难实现的一些场景
5)使得系统的回归测试变的更加方便

缺点:
1)技术门槛比较高 —需要学习一门语言
2)工具本身没有想象力和创造力,无法进行主观的判断(用户体验、审美测试等)
3)自动化测试工具本身是一个产品,产品会有局限性,也会有bug

5、关于自动化测试的误解

1)自动化测试可以完全替代手工测试 获取需求文档,测试计划、测试方案、测试用例…
2)使用自动化测试可以发现更多的bug 自动化测试的意义并不是在于发现更多的bug,而是保证产品在迭代的过程中,原有的测试功能依然能够正常运行。

6、自动化测试的使用场景

并不是所有的项目都适合开展自动化测试,一般来说,至少需要满足如下三个条件,才会考虑开展自动化测试。
1)软件需要变动不频繁
2)项目周期长 项目周期短一般不会考虑开展自动化测试
3)自动化测试脚本可重复利用

7、自动化测试的测试流程
1)获取需求文档
2)编写测试计划
3)编写测试用例
4)编写测试脚本
5)测试执行

Web UI自动化测试

1、什么是Web UI自动化测试?
传统的UI测试通过人工的方式去操作用户界面,从而发现程序的bug
定义:UI自动化测试实际上就是使用代码来替代手工的操作,完成对用户界面的测试。

2、UI自动化测试应该集中在哪些方面?
1)UI的文本、图片显示正确性 只是验证图片显示即可,图片的内容的正确性使用接口测试来验证,收益和成本不成正比
2)UI的交互逻辑正确性测试
3)UI的用户行为正确性测试 UI自动化测试一般不会做异常场景的测试 原因:成本高,收益小

3、UI自动化测试的难点
1)UI本身的变化性
2)UI控件元素本身识别的复杂性
3)UI自动化测试出现问题时,恢复到下一条测试用例场景是比较复杂的。

Selenium工具

1、selenium工具简介
04年,由Jason Huggins 在Thoughtworks公司做测试工作的的时候萌生了一个想法:不能把有限的生命投入无限手工测试当中。
05年,selenium RC诞生,selenium 1诞生
07年,WebDriver诞生
09年,selenium RC 和 WebDriver合并了,诞生selenium 2.0
09年后,selenium 3诞生

selenium 名字的由来
se 硒 化学元素
QTP 由一家美国公司mercury 开发的。 mercury 也是一个化学元素,汞,水银。
硒 克 汞。
Mercury公司被惠普收购了。

2、selenium的特点:

1、开源、免费
2、Selenium是专门为Web应用程序编写的一个验收测试工具
3、Selenium支持各大主流的浏览器: Chrome、Firefox、IE、Edge、safari 等
4、Selenium支持目前主流的编程语言:java、Python、ruby、c、javaScript等
5、Selenium可以做兼容性测试,可以测试Web应用程序是否可以在不同的浏览器和操作系统上是否能够正常运行
6、Selenium可以做功能测试:可以测试web应用程序的功能。

Selenium IDE可以录制手工的操作,把转换成自动化脚本。使用IDE录制的脚本有很多元素定位不准确,所以需要重新定位元素。
IDE是firefox的一个插件。

Selenium 3.0 = selenium WebDriver + selenium Grid 去掉了RC

3、自动化环境的搭建

3.1、安装selenium
对于Python来说,selenium是一个第三方库,所以额外进行安装。
安装方式:
1、在线安装 —推荐使用的一种安装 (有外网)
步骤:1、打开cmd窗口 2、输入 pip install 库名 例如: pip install selenium,如下图所示

2、离线安装
需要获取到离线安装包(查看要安装的库是否有依赖),需要首先安装依赖库,然后再安装要安装的库。

步骤:1、打开cmd窗口 2、输入 pip install 离线安装包所在目录 + 库
.whl 压缩文件
如下图所示,表示安装成功

怎么查看要安装的库是否有依赖
步骤:1、打开cmd窗口 2、pip show selenium,如下图所示,urllib3就是selenium的依赖库

卸载的过程:1、打开cmd窗口 2、输入卸载的命令 pip uninstall selenium 然后敲回车。 3、proceed(y/n)? 输入 y 再敲回车

3.2、安装浏览器和配置WebDriver
安装的浏览器版本和webdriver的版本一定、一定、一定要匹配。
1、首先安装浏览器或者获取到电脑中的浏览器的版本
2、然后在官网下载webdriver 对应的版本
3、把chromedriver.exe所在的目录配置到环境变量中
备注:如果chromedriver.exe是在pycharm启动以后配置的,则需要重启一下pycharm。

环境变量的配置过程:点击Windows按钮,选中“计算机”,点击鼠标右键,选择“属性“,点击“高级系统设置” —>进入到“系统属性”界面---->点击切换到“高级”页---->点击“环境变量”---->找到系统变量中名称 path的变量,然后点击“编辑”按钮,然后把chromedriver.exe所在的目录放在path的最前面,然后后面加上一个 英文分号,点击确定按钮完成环境变量的配置。

实例化一个浏览器驱动对象,作用:打开浏览器
driver = webdriver.Chrome(“D:\Drivers\chromedriver.exe”)
实例化的浏览器驱动对象的类型是WebDriver。

WebDriver类
1、常见的方法
1)get() 作用:在浏览器中输入指定的URL
get()的含义:To open an URL and it will wait till the whole page get loaded.
在浏览器中输入指定的URL
driver.get(“https://www.xxxxxxxxx.com”)

解释器的配置:
1、点击file —>settings
2、找到Project:项目名—>点击project Interpreter
3、如果右侧看不到selenium,则说明需要重新配置一个解释器
4、点击“设置”按钮—>点击“Add Local…”
5、选择虚拟环境创建解释器,Location:默认选择项目所在的目录 Base interpreter 可以是Python的解释器,也可以是虚拟环境创建的解释器 inherit global site-packages 就是表示集成全局的第三方库 make available to all projects 使创建的解释器对所有的项目都是可用的。
6、点击“OK”按钮完成解释器的配置。

2)close() 作用:关闭当前的页面(相当于关闭掉标签页)

close() 作用:关闭当前的页面

driver.close()

3)quit() 作用:退出浏览器(退出整个浏览器)

quit() 作用:退出浏览器

driver.quit()
2、常见的属性
1)title 获取浏览器窗口上的页面的标题

title 获取当前页面的标题

print (f"当前页面的标题为:{driver.title}") # 字符串格式化的一种方法:F-string Python3.6 才有的一个功能
2)current_url 获取当前页面的URL

current_url 获取当前页面的URL

print (f"当前页面的URL为:{driver.current_url}")

WebElement类 --页面元素的类型
常见的方法:
1、clear() 作用:清除文本内容

clear() 清除文本的内容

ele.clear()
2、send_keys() 作用:向元素(文本输入框)中输入指定的内容

send_keys() 向输入框中输入指定的内容

ele.send_keys(“send_keys() 向输入框中输入指定的内容”)
3、get_attribute(name) 作用:获取标签中指定的属性值
name 形参表示要获取的属性的名字

get_attribute() 获取指定的属性值

print (f’元素的ID属性的值为:{ele.get_attribute(“id”)}’)
print (f’元素的name属性的值为:{ele.get_attribute(“name”)}’)

4、is_displayed() 作用:检测元素是否对用户可见

is_displayed() 检测元素是否对用户可见

print (f"判断元素是否可见{ele.is_displayed()}")

5、is_enabled() 作用:检测元素是否可用,可见不一定可用,例如:只读

is_enabled() 检测元素是否可用

print (f’检测元素是否可用:{ele.is_enabled()}’)

6、click() 作用:单击元素

click() 作用:单击元素

ele1.click()

常见的属性
1、text 作用:获取元素的内部文本
双标签/容器标签()才有内部文本,单标签()的文本内容永远都是空字符串。

text 获取元素的内部文本

ele2 = driver.find_element_by_id(“pLabel”)

获取ele2这个元素的内部文本

print (f"文本内容为:{ele2.text}")
2、tag_name 作用:获取标签的标签名

tag_name 获取标签的标签名

print (f"标签的标签名为:{ele2.tag_name}")

3、size 获取元素的尺寸(单位:px (像素))

size 获取元素的尺寸

print (f"输入框元素的尺寸为:{ele.size}")

元素定位
打开开发者工具:F12 或者是点击鼠标右键选择 检查 按钮。

总共2类8种方法

driver.find_element_by_xxx()
如果匹配到多个,则返回匹配到的第一个。
如果匹配不到,则抛出NoSuchElementException异常(报错)。
1、ID 通过元素的id属性来定位元素

id 通过元素的ID属性来定位元素

driver.find_element_by_id(“IamID”).send_keys(“通过元素的ID属性来定位元素”)

2、name 通过元素的name属性来定位元素

name 通过元素的name属性来定位元素

driver.find_element_by_name(“first”).send_keys(“通过元素的name属性来定位元素”)

3、class_name 通过元素的class属性来定位元素

class_name 通过元素的class属性来定位元素

driver.find_element_by_class_name(“poem”).send_keys(“通过元素的class属性来定位元素”)

如果class属性值中有空格,则可以截取class属性的部分值(截取到的部分值中一定不要包含空格)

driver.find_element_by_class_name(“Dream”).send_keys(“通过部分值来定位元素”)

4、tag_name 通过标签的标签名来定位元素

tag_name 通过标签的标签名来定位元素

print (driver.find_element_by_tag_name(“a”).text)

5、link_text 根据 超链接 标签中的文本内容来定位元素 只对a标签是有效

link_text 根据 超链接标签 中的文本内容来定位元素

print (driver.find_element_by_link_text(“唐•李白”).text)
print (driver.find_element_by_link_text(“唐•李白”).get_attribute(“value”))

6、partial_link_text 根据 超链接标签 中的 部分文本来定位元素

partial_link_text 根据 超链接标签***中的 部分文本 来定位元素

print (driver.find_element_by_partial_link_text(“唐”).text)

7、css selector 根据 css选择器 来定位元素
简单用法
在开发者工具中,选中要定位的元素,点击鼠标右键,选择Copy,选择Copy selector,这样就表示copy到了css 选择器。
Chrome浏览器获取css选择器的过程,如下图所示:

Firefox浏览器获取css选择器的过程:

8、xpath 根据 xpath表达式 来定位元素

xpath 根据 xpath表达式来定位元素

driver.find_element_by_xpath(’//*[@id=“IamID”]’).send_keys(“根据 xpath表达式来定位元素”)

简单用法
在开发者工具中,选中要定位的元素,点击鼠标右键,选择Copy,选择xpath,这样就表示copy到了xpath表达式。
Chrome浏览器获取xpath表达式的过程,如下图所示:

Firefox浏览器获取xpath表达式的过程:

**

driver.find_elements_by_xxx()

**
返回的是一个列表。
列表中包含所有匹配到的满足条件的元素。
如果匹配不到,则返回一个空列表。
1、ID 通过元素的id属性来定位元素

id 通过元素的id属性来定位

eles = driver.find_elements_by_id(“IamID”) # 类型是 list
print (eles)
print (type(eles))
print (len(eles))

通过索引来获取到第二个元素

print (f"类型为:{type(eles[1])}") # 什么类型??? WebElment类
eles[1].send_keys(“轻舟已过万重山”)

2、name 通过元素的name属性来定位

name 通过元素的name属性来定位元素

driver.find_elements_by_name(“first”)[1].send_keys(“通过元素的name属性来定位元素”)

如果定位元素没有问题,则强制等待一下。
import time
time.sleep(3)

from time import sleep
sleep(3)

谷歌浏览器有这样一个机制:如果driver是局部变量,为了较少内存的占用,代码执行完以后,会自动关闭掉浏览器。如果不想让浏览器退出,则声明一下driver是一个全局变量。
global driver # 声明driver是一个全局变量

3、class name 通过元素中的class属性来定位元素

class name 通过元素中的class属性来定位元素

driver.find_elements_by_class_name(“poem”)[0].send_keys(“通过元素中的class属性来定位元素”)

4、tag_name 根据标签的标签名来定位元素

tag_name 根据标签的标签名来定位元素

driver.find_elements_by_tag_name(“input”)[1].send_keys(“根据标签的标签名来定位元素”)
5、link_text 根据 超链接标签 中的文本内容来定位元素

link_text 根据 *超链接标签 中的文本内容来定位元素 (只适用于a标签)

print (driver.find_elements_by_link_text(“朝辞白帝彩云间,”)[0].text)

6、partial_link_text 根据 超链接标签 中的 部分文本内容 来定位元素

partial_link_text 根据 *超链接标签 中的 部分文本内容 来定位元素 (只适用于a标签)

print (driver.find_elements_by_partial_link_text(“白”)[0].text)
print (driver.find_elements_by_partial_link_text(“白”)[0].get_attribute(“id”))

7、css selector 根据css选择器来定位元素
简单用法

css selector 根据 css选择器来定位元素

driver.find_elements_by_css_selector("#IamID")[1].send_keys(“根据 css选择器来定位元素”)

8、xpath 根据xpath表达式来定位元素
简单用法

xpath 根据 xpath 表达式来定位元素

driver.find_elements_by_xpath(’//*[@id=“IamID”]’)[1].send_keys(“根据 xpath 表达式来定位元素”)

**

By方法查找元素

**
from selenium.webdriver.common.by import By
2类8种
driver.find_element(By.XXX, “selector”)
如果匹配到多个,则返回匹配到的第一个。
如果匹配不到,则抛出NoSuchElementException异常(报错)。

1、id 通过元素的id属性来定位元素

id 通过元素中的id属性来定位元素

ele = driver.find_element(By.ID, “IamID”) # 类型为 WebElement 类
ele.clear()
ele.send_keys(“By方法查找元素,ID—通过元素中的id属性来定位元素”)

2、name 通过元素的name属性来定位元素

name 通过元素的name属性来定位元素

driver.find_element(By.NAME, “first”).send_keys(“通过元素的name属性来定位元素”)

3、class name 通过元素的class属性来定位元素

class name 通过元素的class属性来定位元素

driver.find_element(By.CLASS_NAME, ‘poem’).send_keys(“通过元素的class属性来定位元素”)

4、tag_name 通过标签的标签名来定位元素

tag_name 通过标签的表掐你名来定位元素

print (driver.find_element(By.TAG_NAME, ‘form’).get_attribute(“id”))
print (driver.find_element(By.TAG_NAME, ‘form’).text)
5、link-text 根据 超链接标签 中的文本内容来定位元素

link_text 根据 超链接标签 中的文本内容来定位元素

print (driver.find_element(By.LINK_TEXT, ‘天上一轮才捧出,’).text)

6、partial_link_text 根据 超链接标签 中的 部分文本内容来定位元素

partial_link_text 根据 超链接标签 中的 部分文本内容来定位元素

print (driver.find_element(By.PARTIAL_LINK_TEXT, “一轮”).text)

7、css selector 根据css选择器来定位元素

css selector 根据 css选取器来定位元素

print (driver.find_element(By.CSS_SELECTOR, ‘#tianshang’).text)

8、xpath 根据xpath表达式来定位元素

xpath 根据xpath表达式来定位元素

print (driver.find_element(By.XPATH, ‘//*[@id=“tianshang”]’).text)

driver.find_elementS(By.XXX, “selector”)
返回的是一个列表,如果匹配不到会怎么样?
如果匹配不到,则返回一个空列表。
1、id 通过元素的id属性来定位元素

id 通过 id属性来定位元素

eles = driver.find_elements(By.ID, ‘IamID’) # 返回一个列表
print (type(eles))
print (eles)
print (len(eles))
eles[1].send_keys(“通过 id属性来定位元素”)

2、name 通过元素的name属性来定位元素

name 通过name属性来定位元素

driver.find_elements(By.NAME, ‘first’)[1].send_keys(“通过name属性来定位元素”)

3、class name 通过class属性来定位元素
如果class属性的值有空格,可以截取部分属性值来定位元素。

class name 通过class属性来定位元素

如果class属性的值有空格,可以截取部分属性值来定位元素。

driver.find_elements(By.CLASS_NAME, ‘Chamber’)[0].send_keys(“满把晴光护玉栏”)

4、tag_name 根据标签的标签名来定位元素

tag_name 根据标签的标签名来定位于素

driver.find_elements(By.TAG_NAME, ‘input’)[3].send_keys(“人间万姓仰头看”)

5、link_text 根据 超链接标签中的文本内容来定位元素

link_text 根据 超链接标签 中的文本内容来定位元素

print (driver.find_elements(By.LINK_TEXT, ‘曹雪芹’)[0].get_attribute(“value”))

6、partial_link_text 根据 超链接标签中的部分文本内容来定位元素

partial_link_text

print (driver.find_elements(By.PARTIAL_LINK_TEXT, ‘白’)[2].text)

7、css selector 根据css选择器来定位元素

css selector 根据css选择器 来定位元素

print (driver.find_elements(By.CSS_SELECTOR, ‘#form > span > a:nth-child(4)’)[0].text)
8、xpath 根据xpath表达式来定位元素

xpath 根据xpath表达式来定位元素

print (driver.find_elements(By.XPATH, ‘//*[@id=“form”]/br’)[0].tag_name)

推荐使用的优先级:

ID name css selector xpath

css selector 的高级用法

CSS(Casading Style Sheets)层叠样式表。一种用来表现HTML或者XML等文件样式的语言。
css 选择器是浏览器用来选择元素,selenium 也要选择元素,可以使用css选择器来选择Web元素。

定位元素的注意事项

1、找到等待定位的元素的唯一属性
2、如果该元素没有唯一属性,则先找到能够给被唯一定位的父元素/子元素/相邻元素,再使用 “>” 、“ ”、“+” 等辅助定位要定位的元素。
3、不要使用随机唯一属性,属性是会发生改变。 ID = “Dev45” Dev46

1、ID选择器 通过 # 来定义,通过元素的ID属性来定位。 格式: #id属性值

#id选择器来定位元素 格式: #id属性值 通过 # 来定义的

print (driver.find_element_by_css_selector("#pLabel").get_attribute(“id”))

2、class选择器(类选择器) 使用 . (点)来定义 格式: .class属性的值

#class 选择器 使用 . (点)来定义 格式: .class属性的值

driver.find_element_by_css_selector(".RedChamber").send_keys(“class 选择器 使用 . (点)来定义 格式: .class属性的值”)

如果class属性值有空格,则可以使用如下方法来定位:
方法一:可以使用 点 替换掉所有的空格(例如: .Dream.of.the.Red.Chamber)
方法二:可以截取一部分值,然后在截取的部分值之前加上 . (点) (例如: .Dream)

class属性值有空格 driver.find_element_by_css_selector(".Dream.of.the.Red.Chamber").send_keys(“class属性值有空格”)

driver.find_element_by_css_selector(".Dream").send_keys(“截取部分值在前面加上点来定位”)

3、标签选择器 通过 标签的标签名 来定位元素

#标签选择器 通过标签的标签名来定位元素

print (driver.find_element_by_css_selector(“span”).text)

4、属性选择器 根据标签中的属性来定位元素, 格式: [属性名=”属性值”] 指定属性值

#属性选择器 使用方括号把属性扩起来 ,格式: [属性名=“属性值”] 例如: [id=“form”]

print (driver.find_element_by_css_selector(’[id=“form”]’).get_attribute(‘id’))

没有指定属性值,则返回所有具有某个属性的元素。

#没有指定属性值

print (driver.find_element_by_css_selector("[id]").get_attribute(“id”))

5、id选择器和class选择器的组合使用 即要定位的元素既要满足id属性值为指定的值,又要满足class属性的值为指定的值。

#id选择器和class选择器组合使用 #ID .Dream 两个条件是 且 的关系

driver.find_element_by_css_selector("#ID.Dream").send_keys(“id选择器和class选择器组合使用”)

6、id选择器和标签选择器的组合使用 标签选择器只能放在id选择器的前面

#id选择器和标签选择器的组合使用

print (driver.find_element_by_css_selector(“a#tianshang”).text)

7、标签选择器和class选择器组合使用

#标签选择器和class选择器的组合使用 标签选择器只能放在class选择器的前面

点击展开下拉框

driver.find_element_by_css_selector(“select”).click()

选择下拉框中的内容

driver.find_element_by_css_selector(“option.poem”).click()

8、使用多个属性来定位元素

使用多个属性来定位元素

driver.find_element_by_css_selector(’[id=“IamID”][name=“first”]’).send_keys(“使用多个属性来定位元素”)

9、标签选择器、id选择器、class选择器、属性选择器组合使用

标签选择器、id选择器、class选择器、属性选择器组合使用

driver.find_element_by_css_selector(‘input[id=“IamID”].poem[name=“first”]’).send_keys(“标签选择器、id选择器、class选择器、属性选择器组合使用”)

10、分组选择器

使用的场景:id的属性值 在 ID1 和 ID2 之间变化,只能使用id属性来定位元素,此时可以使用分组选择器来定位元素。

分组选择器 使用 , (逗号)来定义

driver.find_element_by_css_selector("#IamID1,#IamID2").send_keys(“使用 , (逗号)来定义”)

11、后代选择器 使用 空格 来定义,父元素 加上 空格 后代元素

只能够选择到直系 后代,而不能选择 旁系后代,不论是儿子还是孙子都可以。

后代选择器 使用 父元素 加上 空格 后面元素

print (driver.find_element_by_css_selector("#form span").tag_name)

12、子元素选择器 只能选择自己的儿子,不能隔代, 使用 > 来定位

子元素选择器 使用 > (大于号)来定位 只能选择自己的儿子,不能隔代

print (driver.find_element_by_css_selector(’[id=“form”] > span’).text)

13、相邻兄弟选择器 相邻的(两个元素之间不能有间隔) 兄弟关系(有相同的父元素),只能向后 选择,不能向前选择。 使用 + 号来定位

相邻兄弟选择器 使用 + 来定位

print (driver.find_element_by_css_selector(".Dream + br").tag_name)

14、后续兄弟选择器 使用 ~ 来定位,后续兄弟选择器选取所有指定元素之后的兄弟元素,中间可以有间隔。

后续兄弟选择器 使用 ~ 来定位,后续兄弟选择器选取所有指定元素之后的兄弟元素,中间可以有间隔。

print (driver.find_element_by_css_selector("#pLabel ~ br").tag_name)

15、伪类

Pseudo-classes [‘su:dƏu]
伪类选择元素基于的是当前元素处于的状态,或者元素当前所有的特性,而不是元素的id、class等静态属性标志。由于状态是动态变换的,所有一个元素达到一个状态以后,就可能获取到一个伪类的样式,当状态改变时,就有可能失去了这个样式。它的功能与class(类)类似,所以称之为伪类。

1):nth-child(n) 匹配属于其父元素下的第n个子元素

option:nth-child(3) 表示匹配到 option元素的父元素下的第3个子元素。

:nth-child(n) 匹配属于其父元素下的第n个子元素

print (driver.find_element_by_css_selector(“option:nth-child(3)”).get_attribute(“value”))

2):nth-last-child(n) 匹配属于其父元素下的倒数第n个子元素

:nth-last-child(n) 匹配属于其父元素下的倒数第n个子元素

print (driver.find_element_by_css_selector(“option:nth-last-child(4)”).get_attribute(“value”))

3):first-child 匹配属于其父元素下的第1个子元素

:first-child 匹配属于其父元素下的第1个子元素 # print (driver.find_element_by_css_selector(“option:first-child”).text)

4):last-child 匹配属于其父元素下的最后1个子元素

:last-child 匹配属于其父元素下的最后1个子元素

print (driver.find_element_by_css_selector(‘option:last-child’).text)

浏览器的操作
1、最大化浏览器

最大化浏览器

driver.maximize_window()

2、最小化浏览器

浏览器最小化

driver.minimize_window()
3、设置窗口大小

设置窗口的大小为 高500 宽 600 px

driver.set_window_size(600, 500)

4、刷新

刷新一下界面

driver.refresh()

5、后退

后退

driver.back()

7、前进

前进

driver.forward()

窗口的截图
截取整个屏幕使用的场景:执行用例,如果用例失败的时候,此时可以截图用来进行问题定位。

截取整个屏幕

driver.get_screenshot_as_file("./all.jpeg")

截取单个元素:

截取单个元素 首先需要定位到要截取的这个元素

ele = driver.find_element_by_css_selector(’[class=“el-button el-button–text”]’)

截取定位到这个元素

ele.screenshot("./single.png")

使用绝对路径来定位元素 定位到第一个输入框并输入内容

driver.find_element_by_xpath(“html/body/form/span/input”).send_keys(“使用绝对路径来定位第一个输入框”)

使用绝对路径来找元素的缺点:
一旦目录结构发生了改变,路径也就随之失效,必须重新定位。

2、使用相对路径来查找元素
/ 表示从根节点选取,也就是从当前节点的最顶层(HTML中默认情况下当前当前节点的最顶层是html标签。如果从某个元素开始,则当前节点就表示此元素)

// 表示从匹配选取的当前节点 向下 选取文档中的节点,不考虑他所在的位置。

使用相对路径来查找元素

// 表示从匹配选取的当前节点 向下 选取文档中的节点,不考虑他所在的位置。

driver.find_element_by_xpath("//input").send_keys(“使用相对路径来查找元素”)

(一个点)表示选取当前节点 自己

driver.find_element_by_xpath("//input/.").send_keys(". (点)表示选取当前节点 自己")

(两个点) 表示选取当前节点的父节点

print (driver.find_element_by_xpath("//input/…").get_attribute(“id”))

索引定位
例如: //input[2] 表示匹配任意一个节点下的第二个input标签 索引是从1开始。
不是匹配到所有的input标签中的第二个。

索引定位 //input[2] 表示匹配任意一个节点下的第二个input标签

driver.find_element_by_xpath("//input[2]").send_keys("//input[2] 表示匹配任意一个节点下的第二个input标签")

属性定位
使用 @ 来选取属性,格式: //input[@属性名=”属性值”]
//input[@id=“IamID”] 表示匹配到任意一个节点下的 id属性值为IamID的input标签

属性定位 使用 @ 来选取属性, 格式: //标签名[@属性名=”属性值”]

driver.find_element_by_xpath(’//input[@id=“IamID”]’).send_keys(“属性定位,使用 @ 来选取属性”)

使用 * 来代替标签名 通配符
//*[@id=“IamID”] 表示匹配到任意一个节点下的 id属性值为IamID的任意一个标签

使用 * 来替代标签名

driver.find_element_by_xpath(’//*[@id=“IamID”]’).send_keys(“使用 * 来替代标签名”)

部分属性定位
1、contains() 格式: //[contains(@属性名, “部分属性值”)]
例如: //
[contains(@id, “IamID”)] 表示匹配到任意一个节点下的 id属性值包含IamID的任意一个元素

contains() 格式: //*[contains(@属性名,“部分属性值”)]

例如: //*[contains(@id, “IamID”)] 表示匹配到任意一个节点下的 id属性值包含IamID的任意一个元素

driver.find_element_by_xpath(’//*[contains(@id, “Iam”)]’).send_keys(“contains()”)

2、starts-with() 格式: //*[starts-with(@属性名, “属性的开始部分的值”)]

starts-with() 格式: //*[starts-with(@属性名, “属性的开始部分的值”)]

driver.find_element_by_xpath(’//*[starts-with(@id, “Iam”)]’).send_keys(“starts-with()”)

3、ends-with() 格式: //*[ends-with(@属性名, “属性的结束部分的值”)]
ends-with() 是xpath 2.0的语法,但是目前浏览器还不支持。

文本内容定位
1、使用全部文本来定位元素 格式://*[text()=”文本内容”]

使用全部文本来定位 //*[text()="早发白帝城 "]

print (driver.find_element_by_xpath(’//[text()="早发白帝城 "]’).text)
2、使用部分文本内容来定位元素 格式: //
[contains(text(), “部分文本内容”)]

使用部分文本内容来定位元素 格式: //*[contains(text(), “部分文本内容”)]

print (driver.find_element_by_xpath(’//*[contains(text(), “发”)]’).get_attribute(“id”))

轴定位
Xpath轴定位的应用场景:当某个元素的各个属性及其组合都不足以定位时,可以利用其它兄弟节点或者父节点等各种可以定位的元素进行辅助定位。
使用语法: 轴名称::标签名

1、parent:: 表示选取当前节点的父节点

parent:: 表示选取当前节点的父节点

print (driver.find_element_by_xpath(’//*[@id=“title”]/parent::span’).tag_name)

2、child:: 表示选取当前节点的子元素

child:: 表示选取当前节点的子元素

print (driver.find_element_by_xpath(’//*[@id=“title”]/child::br’).tag_name)

3、ancestor:: 表示选取当前节点的所有的 直系 先辈(父、祖父等)

ancestor:: 表示选取当前节点的 直系先辈

print (driver.find_element_by_xpath(’//*[@id=“form”]/child::span/child::a[3]/ancestor::body’).text)

4、descendant:: 表示选取当前节点的所有的 直系 后代元素(儿子,孙子等)

descendant:: 表示选取当前节点的所有的直系 后代元素

driver.find_element_by_xpath(’//*[@id=“form”]/descendant::input[2]’).send_keys(“descendant:: 表示选取当前节点的所有的直系 后代元素”)

5、preceding:: 表示选取当前节点 的开始标签 之前 的所有的节点(要定位的节点的结束标签要在 当前节点 的开始标签 之前)

preceding:: 表示选取当前节点的开始标签 之前的 所有的元素 如果要使用索引,则索引是从当前节点开始往前数

print (driver.find_element_by_xpath(’//*[@id=“form”]/descendant::input[2]/preceding::a[1]’).text)

6、preceding-sibling:: 表示选取当前节点 的开始标签 之前 的所有的 同级 节点(要定位的节点的结束标签要在 当前节点 的开始标签 之前)

preceding-sibling:: 表示选取当前节点 的开始标签 之前 的所有的 同级 节点(要定位的节点的结束标签要在 当前节点 的开始标签 之前)

print (driver.find_element_by_xpath(’//*[@id=“jiayucun”]/preceding-sibling::a[2]’).text)

7、following:: 表示选取当前节点 的结束标签 之后 的所有节点

following:: 表示选取当前节点 的结束标签 之后 的所有节点(即要定位的元素的开始标签要在当前元素的 结束标签之后)

print(driver.find_element_by_xpath(’//*[@id=“jiayucun”]/following::div[1]’).text)

8、following-sibling:: 表示选取当前节点 的结束标签 之后 的所有 同级 节点

following-sibling:: 表示选取当前节点 的结束标签 之后 的所有 同级 节点

print (driver.find_element_by_xpath(’//*[@id=“jiayucun”]/following-sibling::span’).text)

逻辑运算符
and

and //*[@id=“IamID” and @name=“first”] 表示要定位的元素id属性的值为IamID并且name属性的值为first 的任意一个元素

driver.find_element_by_xpath(’//*[@id=“IamID” and @name=“first” and @class=“poem”]’).send_keys(“逻辑运算符and”)

or

driver.find_element_by_xpath(’//*[@id=“IamID” or @name=“first”]’).send_keys(‘or’)

not()

not()

print (driver.find_element_by_xpath(’//*[not(@id=“IamID” and @name=“first”)]’).tag_name)

对话框的处理

alert
如果对话框弹出来以后,不关闭的话没有办法执行其他的操作。所以执行其他操作之前需要关闭掉对话框。
selenium定位不到对话框。

1、accept() 相当于点击了确认按钮

获取到对话框,然后才能处理对话框

dialog = driver.switch_to.alert

点击确定按钮
dialog.accept()

2、dismiss() 相当于点击取消按钮

dismiss() 相当于点击了 对话框 中的取消按钮 # 获取到对话框,然后才能处理对话框
dialog = driver.switch_to.alert

#driver.switch_to_alert() # Deprecated 这种方法已经弃用,不建议使用

点击取消按钮

dialog.dismiss()

3、向对话框中输入内容

获取对话框

dialog = driver.switch_to.alert

向对话框中输入内容

dialog.send_keys(“向对话框中输入内容”)

点击确认按钮

dialog.accept()

4、获取对话框中的文本内容

获取到对话框,然后才能处理对话框

dialog = driver.switch_to.alert

获取对话框中的文本内容

print (dialog.text)

你可能感兴趣的:(自动化测试,python,selenium,定位)