做贷款行业哪些网站能发布广告,关键字优化,做模块高考题的网站,宜选科技就是帮人做网站在ui自动化测试中#xff0c;几乎出现问题最多的情况就是定位不到元素 #xff0c;当你的自动化在运行过程中 #xff0c;突然发现报错走不下去了 。很大概率就是因为找不到元素 #xff0c;而找不到元素的一个主要原因就是页面加载慢 #xff0c;代码运行速度快导致 。
…在ui自动化测试中几乎出现问题最多的情况就是定位不到元素 当你的自动化在运行过程中 突然发现报错走不下去了 。很大概率就是因为找不到元素 而找不到元素的一个主要原因就是页面加载慢 代码运行速度快导致 。
遇到以上的问题 该怎么办呢 其中一个解决方案就是加等待时间 。
1.元素等待介绍
1.什么是元素等待 在运行web自动化的过程中有两个运行速度 。 一个就是代码的运行速度 一个是浏览器的渲染速度 。
代码的运行速度很快 基本都是保持在毫秒级甚至以下 通过人眼的观察你可能都看不到的运行过程就已经结束了 而浏览器的渲染速度较慢 一般保持在毫秒到秒级别 再加上网络时间和网站的一些性能问题 这个速度就更慢 。
而在web自动化中 这两个速度的关联就是代码运行驱动浏览器的运行 代码运行速度快 有时候浏览器渲染速度跟不上 就会导致找不到元素的情况 。解决的办法就是让代码的运行速度慢一些 在执行过程中等待一会或者检查下浏览器的元素出来没有 如果出来了则再运行 这就是元素等待的本质 。
2.三种等待方式
在web自动化中 可以使用以下三种等待方式 分别是强制等待 、隐式等待 、显示等待 。
2.1 强制等待
所谓的强制等待 就是通过python time模块中的sleep方法 让代码在某个地方暂停n秒 。放在自动化中 就是让代码的运行暂时先停下来 让浏览器的渲染速度更上代码的允许速度 。
# 导包 import time
# 等待5s : time.sleep(5)
在这里就存在这个问题 web自动化代码那么多 我应该把这种强制等待放在哪里呢 具体的说放在那一行代码呢 这个问题的答案跟我们的系统有关系 一般编写好代码以后 我们都会进行调试运行 在调试运行的过程中 你会发现某个页面的加载速度比较长 页面元素多 那么进入这个页面以后往往就需要加等待时间 对应代码的位置就是加载这个页面的下一行就是等待时间的代码 。
那么 当出现一个加载慢的页面时 应设置几秒的等待时间呢 3s还是5s ? 这就需要我们多次运行以观察在该页面一般需要几秒加载出来 一般设置的等待时间会比这个长个1~2s .大白话就是我们需要根据观察得出一个等待时间 这个时间往往都是我们主观判断得出 的经常会出现等待时间不够或者等待时间过长的情况 。 它的优点是在一些不稳定的页面、复杂的页面 使用强制等待是比较好的反正就等那么长时间 。 它的缺点是因为时间往往是根据我们的经验值设置 难免会出现等待时间长的情况 这样就降低了自动化的执行效率 。其实很多情况下页面元素早已出现 而我们设置的等待时间还没有到 它还在那傻傻的等 直到时间到了它才会继续运行 。
2.2 隐式等待
什么是隐式等待 隐式等待是对页面中的所有元素进行等待 它也需要设置一个等待时间在等待的时间内当页面所有元素都加载出来后就往下执行了 即便时间没到也会继续往下执行 。所以 它的等待结束时间是页面所有元素都加载完而不是它设置的等待时间 。当然 这里面还有一种情况就是等待时间已用完但是页面元素还没有都加载出来 这时就会抛出异常 。
比如我一个页面有200个页面对象 有输入框、有按钮、有链接、有图标等 。使用隐式等待就是在规定的时间内若这200个页面对象都加载出来了就继续往下执行 否则到了规定时间还有元素没加载完就会报错 。
# 隐式等待
driver.implicitly_wait(5) # 等待5s .
这是webDriver里的一个方法 可使用浏览器对象直接调用 。 它的优点是相比time.sleep()而言 它更加智能 不需要必须等到所有时间用完才往下执行 。也许你设置了5s ,但是当到了3s时页面元素都已加载出来 这个时候它就会继续往下执行了 这样就能提高执行效率 。 它的缺点是 它的这种等待方式不太合理 很多情况下 我们定位的是具体的某个元素 也就是说我们等待的是一个元素 而它现在是等待这个页面的所有元素 。即便我们要等到元素早以出现 但是它还是要把所有元素都加载完才会继续运行 。所以从效率上还是优化空间的 。
2.3 显式等待
什么是显式等待 显式等待就是针对某个特定的元素设置等待时间 它就等待一个元素 元素出现则往下运行 元素没出现则继续等待直到等到到超出规定的等待时间 这时也会抛出NoSuchElementException异常 。
还是以上面的例子说明 比如一个页面有200个对象 有输入框、有按钮、有链接、有图标等 。但是我在代码中设置就等待其中的一个操作按钮 使用显式等待后它就会等待这一个操作按钮 如果这个按钮的元素已经加载出来即便其它元素仍没有加载出来 它也不管 则会继续往下运行。
# 1.导包 from selenium.webdriver.support.wait import WebDriverWait
# 2.使用类WebDriverWait(driver,timeout,poll_frequency0.5)driver : 浏览器驱动对象timeout : 超时的时长 单位 秒poll_frequency : 检测间隔时间 默认为0.5s
# 3)调用它的方法 until(method) 直到 ... 时 此方法返回的布尔值。method 函数名称该函数实现的是对元素的定位 。一般使用匿名函数来实现 #显式等待的完整代码如下
WebDriverWait(driver,10,0.5).until(lambda driver:driver.find_element_by_id(username)) 它的优点是只等待一个元素 等待到即可继续运行 花费时间最少 执行效率也高 所以一般都会用此方法并且会将它封装成一个公共方法 。
三种方法总结 显式等待 等待页面中的一个元素 等待到即可继续运行时间到还没有等待到即报错 隐式等待 等待页面中的所有元素 所有元素加载完即可继续运行 时间到还没有加载完的即报错 。 强制等待 按时间等待 无论页面元素是否加载完毕 它都会继续运行 。
3.具体案例
需求通过selenium完成对tpshop的登录操作具体如下 点击首页登录 使用显式等待8s . 输入用户名 输入密码 输入验证 。 使用逻辑与属性定位用户名输入框并输入账号如13988888888 点击登录 使用隐藏等待 等待时间8s . 进入首页 点击安全退出按钮 使用强制等待2s . 关闭浏览器
# 定位tpshop登录
from selenium import webdriver
from time import sleep
from selenium.webdriver.support.wait import WebDriverWait# 1. 创建浏览器对象
driver webdriver.Chrome()
driver.maximize_window()# 2. 输入地址
driver.get(http://localhost)# 3. 元素定位
# 3.1 点击登录 link_text
driver.find_element_by_link_text(登录).click()# 定位输入框 显式等待8s .
WebDriverWait(driver,8,0.5).until(lambda driver:driver.find_element_by_id(username))# 3.2 输入用户名
driver.find_element_by_id(username).send_keys(13088888888)# 3.3 输入密码
driver.find_element_by_name(password).send_keys(123456)# 3.4 输入验证码
driver.find_element_by_id(verify_code).send_keys(8888)# 4. 点击登录
driver.find_element_by_class_name(J-login-submit).click()driver.implicitly_wait(8) # 隐式等待# 点击安全退出按钮
driver.find_element_by_link_text(安全退出).click()
sleep(2) # 强制等待2s driver.quit()