选择元素基础与同步测试问题的解决

选择元素基础与同步测试问题的解决

实验目的:了解在selenium中选择界面元素的基础方法,能在PyCharm环境下使用selenium操纵相关元素执行点击、输入数据操作;了解何时需要同步测试,掌握解决同步测试的三种方法。

实验要求:在pycharm 环境下完成实验目的中所述各项任务

实验条件:win7/10、pycharm、selenium4.4.0

实验内容及步骤:

在执行WEB界面自动化测试时,要操控网页上的元素,首先需要选择界面元素,或者说定位界面元素。也就是先要告诉浏览器,你要操作哪个界面元素,让它找到你要操作的对象。因此,我们做测试时要让浏览器找到元素,一般使用元素的特征来确定一个Web元素,也就是用什么属性能够识别出指定的元素与其它元素的区别。

Selenium中的WebDriver对象和WebElement对象都提供了find_element(find_elements)函数,使用添加不同参数的方法帮助我们定位元素。

使用前先要导入By方法:from selenium.webdriver.common.by import By

练习网页:https://cdn2.byhy.net/files/selenium/sample1.html

一、 WebDriver对象的find_element(find_elements)函数:

  1. 根据 id 属性 选择元素: driver.find_element(By.ID, 'id值') ,此语句返回对应id值的元素,若没有符合条件的元素,则返回NoSuchElementException 异常。由于id值是唯一的,所以它是最高效的定位元素方法。

  2. 根据 类别名称 class属性 选择元素:由于相关类别名称的元素可能有多个,一般选择时会有多个返回值,保存在一个列表中,所以使用find_elements函数执行类别选择,例如我们常写为: driver.find_elements(By.CLASS_NAME, 'class值') 。对于find_elements函数执行时,若没有符合条件的元素,则返回空列表。

注意,当一个元素有多个class 类型时,可以使用其中任何一个class属性值来选择此元素,而不能同时列出多个class 类型值。

  1. 根据 tag标签名选择元素:与上面的class属性类似,一般任意打开一个页面,都会发现大量的tag标签,选择时会有多个返回值,保存在一个列表中,常常使用find_elements函数执行选择,例如:driver.find_elements(By.TAG_NAME, 'tag值'),由于重复率高,应尽量少用。

  2. 根据name属性选择元素:例如:find_element(By.NAME, 'name值')

  3. 根据link_text链接标签选择元素(a标签,专门用来定位超链接文本,精确匹配):例如:find_element(By.LINK_TEXT, '超链接文本值')

  4. 根据partial_link_text链接标签选择元素(通过传入a标签局部文本或全部文本来定位元素,模糊匹配):它是对link_text定位的一种补充,当链接上的文本内容比较长的时候,可以取文本的一部分进行定位,当然这部分可以唯一地标识这个链接。例如:find_element(By.PARTIAL_LINK_TEXT, '超链接部分文本值')

选中元素后的操作函数:鼠标左键点击操作click() 与 传入文本操作sent_keys(str),其中str为String类型的文本。

二、 WebElement对象的find_element(find_elements)函数:让我们在元素内部再选择元素

element = driver.find_element(By.ID,'container')

spans = element.find_elements(By.TAG_NAME, 'span')

wps2

当我们运行测试时,应用程序可能不会和我们输入操作同步给出反应。比如:当我们从数据库中查询信息、一个新窗口的弹出、一个进程条到达100%、显示一个状态信息等都需要占用几秒钟的时间。这种由于应用程序反应时间过慢,界面元素尚未出现我们就执行了针对该元素的操作,这会导致测试失败。这就是测试与程序运行不同步的问题。

练习网页:https://www.byhy.net/_files/stock1.html

三、 测试同步问题的解决:

  1. 强制等待:sleep 直接设置等待时间。

首先导入time 包使用sleep方法:

from time import sleep

sleep(秒数)

这种方法过于固化,假如一个自动化程序里面某个测试过程设置等待时间过小,测试依然会失败,如果加大等待时间,而此时服务器反映很快,根本不需要你设定的很大的等待时间,就会造成大量的时间浪费。

  1. 隐式等待: implicitly_wait

这是Webdriver 对象的一个方法,应用时直接使用实例化的Webdriver 对象来调用:

driver.implicitly_wait(秒数)

使用该方法时,如果发现元素没有找到,并不立即返回找不到元素的错误,而是通过设定一个最大等待时间的参数,使测试程序周期性(每隔半秒钟)重新寻找该元素,直到该元素找到,或者超出指定最大等待时长,这时才抛出异常。

  1. 显式等待: WebDriverWait

有一些更复杂的情况:操作引起了页面的变化,而接下来要操作变化的元素的时候,就需要使用显式等待。

首先导入显式等待:

from selenium.webdriver.support.wait import WebDriverWait

WebDriverWait(driver, timeout, poll_frequency=0.5, ignored_exceptions=None)

其中,driver:浏览器驱动; timeout:等待上限,单位是秒; poll_frequency:检测的轮询间隔,默认值是0.5秒;ignored_exceptions:超时后抛出的异常信息,默认抛出NoSuchElementExeception异常。

在使用显式等待 WebDriverWait 时要明确,条件是选择的元素必须可见。这就往往需要结合until()或者until_not()和expected_conditions类来使用。

这时需要先导入期望条件:

from selenium.webdriver.support import expected_conditions as EC

再使用显式等待,例如:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

# 定义Chrom浏览器驱动的路径地址
path = 'D:\\chromedriver.exe'
driver = webdriver.Chrome(service=Service(path))

# 打开百度网页
driver.get("https://www.baidu.com")

# 定位登录按钮并点击
driver.find_element(By.LINK_TEXT, '登录').click()

# 设置显示等待
# 等待元素 id = 'TANGRAM__PSP_11__changeSmsCodeItem' 加载到DOM树中,
# 等待上限是10秒,每0.8秒去验证一下条件是否成立
WebDriverWait(driver, 10, 0.8).until(EC.presence_of_element_located(By.ID, 'TANGRAM__PSP_11__changeSmsCodeItem'))

# 点击短信登录选项卡
driver.find_element(By.ID, 'TANGRAM__PSP_11__changeSmsCodeItem').click()

练习:要求如下

  1. 以管理员身份登录 http://127.0.0.1:8047/mgr/sign.html,用户名 :byhy 密码: 88888888

  2. 检查左侧菜单,预期结果为:前三项菜单名称分别为:客户、药品、订单

  3. 注意,必须输出测试结果:若是预期结果的三项菜单,则输出“测试通过”,否则输出“测试不通过”

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
import time

from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By

# 本程序 在个人电脑 使用 anaconda 集成环境创建了虚拟环境,
# 已将chromedriver 放置于虚拟环境目录下 即无需声明驱动器路径
driver = webdriver.Chrome()

driver.get("http://127.0.0.1:8047/mgr/sign.html")

username = driver.find_element(By.ID, "username")
username.send_keys("byhy")
username.click()
password = driver.find_element(By.ID, "password")
password.send_keys("88888888")
password.click()
driver.find_element(By.XPATH, "/html/body/div/div[2]/div[1]/div[3]/div/button").click()
time.sleep(1)
Menubar = driver.find_elements(By.XPATH, '//*[@id="root"]/aside/section/ul')
# print(Menubar.find_element(By.TAG_NAME,"span"))
barElemetnList = Menubar[0].find_elements(By.TAG_NAME, "span")
barList = []
for item in barElemetnList:
if len(barList) < 3:
barList.append(item.text)


targetList = ["客户", "药品", "订单"]

if barList == targetList:
print("测试通过")
print("测试不通过")

选择元素基础与同步测试问题的解决
http://example.com/2024/12/15/测试笔记/selenium/selenium01/
作者
Helios
发布于
2024年12月15日
许可协议