selenium_3种等待以及unittest测试框架_智能等待

前言:为什么需要等待

由于代码的执行速度 远远大于 浏览器的渲染速度,导致元素定位不到。

常见的情况:①有frame ②ajax请求局部刷新,元素才生成


1.强制等待

顾名思义,强制等待,时间到了然后才能执行,就是线程阻塞。

导入time模块

import time

弊端

大量使用强制等待,降低脚本执行速度

一个例子

效果:打开浏览器,请求百度官网,然后等待5秒,关闭浏览器

# 导入time模块,使用它的sleep()方法
import time
# 从selenium导入webdriver模块
from selenium import webdriver
# 创建一个chrome驱动
driver = webdriver.Chrome()
# get请求
driver.get("http://www.baidu.com")
# 强制等待5秒,单位是秒
time.sleep(5)
# 关闭浏览器
driver.quit()

2.隐式等待

全局生效,如果超过规定的时间,元素还未加载完成,就往后执行。
如果在规定时间内加载完成了,就立即往后执行,不需要继续等待。
针对元素是否生成

弊端

它只是等待元素是否生成,很多时候不是元素等待是否生成,而是等待元素的属性或者内容的改变,那么这个等待就无法捕获到这个变化。

一个例子
# 从selenium导入webdriver模块
from selenium import webdriver
# 创建一个chrome驱动
driver = webdriver.Chrome()
# get请求
driver.get("http://www.baidu.com")
# 隐式等待5秒(全局生效:如果超过5秒还未加载完成,就往后执行)
driver.implicitly_wait(5)
# 关闭浏览器
driver.quit()

3.显式等待

可针对每一个元素单独设置,等待条件更加灵活。

导入WebDriverWait模块

from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

常用的EC方法

text_to_be_present_in_element() //判断某元素的text内容是否包含预期字符

一个例子

总等待时间5秒,当id=msg的元素的内容包含了“出错了”。
超过时间了往后执行了

# unitl()等待,里面放入等待条件
WebDriverWait(driver,5).until
  (EC.text_to_be_present_in_element(("id","msg"),"出错了"))
# 打印id="msg"元素的内容
print(driver.find_element("id","msg").text)

智能等待(隐式等待Plus)

用于 ajax请求,开始没有这个元素,后续请求才会出现
例如:鼠标悬浮出现下拉框,很多时候下拉框是通过ajax请求得到的。
针对元素的是否生成

导入模块

import unittest
from selenium import webdriver
from selenium.common.exceptions import NoSuchElementException
from selenium.webdriver.support.wait import WebDriverWait

一个例子
import unittest
from selenium import webdriver
# 找不到元素的异常
from selenium.common.exceptions import NoSuchElementException
# 等待的包
from selenium.webdriver.support.wait import WebDriverWait

"""
  智能封装等待找元素的方法:
    常用于某些元素开始是没有显示的,后续才显示
    但是之前找元素就会没有找到
"""
class MyTest(unittest.TestCase):
    # 初始化操作
    def setUp(self) ->None:
        self.driver = webdriver.Chrome()
        self.url="http://localhost:8080/mms/login.html"
    # 销毁方法
    def tearDown(self):
        # 关闭浏览器
        self.driver.quit()
    def find_element(self,locator):
        try:
            # 总等待时间5秒,每隔默认0.5秒
            # lambda表达式
            element = WebDriverWait(self.driver,5).until(lambda x: x.find_element(*locator))
            return element
        except NoSuchElementException as e:
            print("错误信息:{}".format(e.args(0)))

    def test1(self):
        self.driver.get(self.url)
        self.find_element(("id","username")).send_keys("admir")
        self.find_element(("id","password")).send_keys("123")
            self.find_element(("xpath","//input[@value='Login']")).click()
        self.find_element(("xpath","//*[@id='accordion']/div[1]/div[1]/div[1]")).click()
        self.find_element(("xpath","//*[@id='SC']/a[1]/span")).click()

if __name__ == '__main__':
    unittest.main()
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值