选择元素基础与同步测试问题的解决
选择元素基础与同步测试问题的解决
实验目的:了解在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)函数:
根据 id 属性 选择元素:
driver.find_element(By.ID, 'id值'),此语句返回对应id值的元素,若没有符合条件的元素,则返回NoSuchElementException 异常。由于id值是唯一的,所以它是最高效的定位元素方法。根据 类别名称 class属性 选择元素:由于相关类别名称的元素可能有多个,一般选择时会有多个返回值,保存在一个列表中,所以使用find_elements函数执行类别选择,例如我们常写为:
driver.find_elements(By.CLASS_NAME, 'class值')。对于find_elements函数执行时,若没有符合条件的元素,则返回空列表。
注意,当一个元素有多个class 类型时,可以使用其中任何一个class属性值来选择此元素,而不能同时列出多个class 类型值。
根据 tag标签名选择元素:与上面的class属性类似,一般任意打开一个页面,都会发现大量的tag标签,选择时会有多个返回值,保存在一个列表中,常常使用find_elements函数执行选择,例如:
driver.find_elements(By.TAG_NAME, 'tag值'),由于重复率高,应尽量少用。根据name属性选择元素:例如:
find_element(By.NAME, 'name值')根据link_text链接标签选择元素(a标签,专门用来定位超链接文本,精确匹配):例如:
find_element(By.LINK_TEXT, '超链接文本值')根据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')

当我们运行测试时,应用程序可能不会和我们输入操作同步给出反应。比如:当我们从数据库中查询信息、一个新窗口的弹出、一个进程条到达100%、显示一个状态信息等都需要占用几秒钟的时间。这种由于应用程序反应时间过慢,界面元素尚未出现我们就执行了针对该元素的操作,这会导致测试失败。这就是测试与程序运行不同步的问题。
练习网页:https://www.byhy.net/_files/stock1.html
三、 测试同步问题的解决:
- 强制等待:sleep 直接设置等待时间。
首先导入time 包使用sleep方法:
from time import sleep
sleep(秒数)
这种方法过于固化,假如一个自动化程序里面某个测试过程设置等待时间过小,测试依然会失败,如果加大等待时间,而此时服务器反映很快,根本不需要你设定的很大的等待时间,就会造成大量的时间浪费。
- 隐式等待:
implicitly_wait
这是Webdriver 对象的一个方法,应用时直接使用实例化的Webdriver 对象来调用:
driver.implicitly_wait(秒数)
使用该方法时,如果发现元素没有找到,并不立即返回找不到元素的错误,而是通过设定一个最大等待时间的参数,使测试程序周期性(每隔半秒钟)重新寻找该元素,直到该元素找到,或者超出指定最大等待时长,这时才抛出异常。
- 显式等待:
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 | from selenium import webdriver |
练习:要求如下
以管理员身份登录 http://127.0.0.1:8047/mgr/sign.html,用户名 :byhy 密码: 88888888
检查左侧菜单,预期结果为:前三项菜单名称分别为:客户、药品、订单
注意,必须输出测试结果:若是预期结果的三项菜单,则输出“测试通过”,否则输出“测试不通过”
1 | import time |