Python Web自动化(等待机制)

1.强制等待(sleep)

        定义:设定⼀个固定的等待时⻓,代码运⾏到此处,会强⾏进⾏等待指定的时间。

        缺点:不能准确把握需要等待的时间


        1.有时操作还未完成,等待就结束了,导致报错;

        2.有时操作已经完成了,但等待时间还没有到,浪费时间;

        3.如果在⽤例中⼤量使⽤,会浪费不必要的等待时间,影响测试⽤例的执⾏效率。

        优点:使⽤简单,可以在调试时使⽤。
 

2.隐式等待(implicitly_wait)

        定义:设定⼀个固定的等待时间,对整个⽣命周期的元素都起作⽤,每⼀个元素都会等待加           载完全,直到超过设定的等待时间

                      缺点:使⽤隐式等待,程序会⼀直等待整个⻚⾯加载完成,才会执⾏下⼀步操作;
                      优点:隐性等待对整个driver的周期都起作⽤,所以只要设置⼀次即可。

                        示例:

# 隐式等待设定时⻓为5s
driver.implicitly_wait(5)
driver.get('http://www.baidu.com')
# 隐式等待所有元素加载完成,直到超过设定的最⻓时间
driver.find_element_by_id("element_id").click()

隐式等待可能失效的几大原因:
1.元素不存在
2.页面加载时间过长
3.复杂的页面结构(当页面结构非常复杂且包含大量元素时,隐式等待可能无法有效等待所需元素,
因为它会等待整个页面加载完成)
4.混用隐式等待和显式等待(例如,将隐式等待设置为10秒,将显式等待设置为15秒,可能会导致在20秒后发生超时)

3.显式等待

        示等待需要⽤到两个类: WebDriverWait和expected_conditions两个类

        WebDriverWait:指定轮询间隔、超时时间等

        expected_conditions:指定了很多条件函数(也可以⾃定义条件函数)

                1) WebDriverWait:

                        

WebDriverWait(driver, timeout=30, poll_frequency=0.5, ignored_exceptions=None)
# 参数含义:
driver:浏览器驱动
timeout:最⻓超时时间,默认以秒为单位
poll_frequency:轮询的间隔步⻓,默认为0.5s
ignored_exceptions:忽略等待时出现的特定类型的异常,默认忽略
NoSuchElementExeception异常

                2) until()和until_not():
                        

                WebDriverWait ⼀般是配合until() 或 until_not()⽅法,就能够根据判断条件⽽灵活地等                    待了。主要的意思就是:程序每隔xx秒看⼀眼,如果条件成⽴了,则执⾏下⼀步;否则                  继续等待,直到超过设置的最⻓时间,然后抛出TimeoutException 异常。

                until():

element = WebDriverWait(driver, 10).until(EC.presence_of_element_located
((By.XPATH, "//input[@id='txtUName']")))

                until_not():

                

element = WebDriverWait(driver, 10).until_not(EC.presence_of_element_located
((By.XPATH, "//input[@id='11txtUName']")))

3) expected_conditions搭配显示等待使⽤:

        

from selenium.webdriver.support import expected_conditions as ec
locator:
//定位器
ec.presence_of_element_located((By.ID,'kw'))
element:
//元素本身
ec.visibility_of(driver.find_element(By.ID,'su'))

                我们通过ec来配合until使用,我们在 使用下面的显示等待的方法的时候,要区别方法里面是使用的定位器还是元素本身

        4)通过⻚⾯标题来判断

 

        title_is (title):判断当前⻚⾯的title是否完全等于(==)预期字符串,返回布尔值

        

from selenium.webdriver.support import expected_conditions as ec
locator:
ec.presence_of_element_located((By.ID,'kw'))
element:
ec.visibility_of(driver.find_element(By.ID,'su'))

        

        

# 元素等待直到标题出现"会员登录_读书屋"
WebDriverWait(driver,3).until(EC.title_is('读书屋_原创小说网站'))
sleep(5)

我们通常使用精简版

        

 el = wait.until(ec.title_is("读书屋_原创小说网站"))

        

title_contains (title):判断当前⻚⾯的title是否包含预期字符串,返回布尔值

        

# 元素等待直到标题包含"读书屋"
WebDriverWait(driver, 3).until(EC.title_contains('读书屋'))

5)通过元素是否可⻅来判断


        通常在⽹⻚中并不是所有元素都是可⻅的,也有的是初始化时不可⻅,加载完成时则状态⼜变为可⻅,所以在元素等待中以下这些⽅式是经常被⽤到的

presence_of_element_located (locator):判断某个元素是否被加到了dom树⾥,并不代表该元素⼀定可⻅

示例:

 # 定位器:定位元素的⽅法
    locator = (By.LINK_TEXT, "重生学霸小甜妻")
    # locator = ("link text", "重生学霸小甜妻")

    # 元素:元素本身
    # element = driver.find_element(By.LINK_TEXT, "重生学霸小甜妻")

    # el = wait.until(ec.presence_of_element_located(locator))
    # print("el: ", el)

visibility_of_element_located (locator):判断某个元素是否可⻅. 可⻅代表元素⾮隐藏,并且元素的宽和⾼都不等于0

                

el = wait.until(ec.visibility_of_element_located(locator))
    # el.click()

6)通过等待的元素包含的内容来判断



text_to_be_present_in_element (locator, text_):判断某个元素中的text是否 包含 了预期的字符串

# 通过等待的元素包含的内容来判断
    el = wait.until(ec.text_to_be_present_in_element(locator, "重生学霸小甜妻"))

7)针对下拉框类型的等待,还有可点击的组件,如超链接:

element_to_be_clickable (locator):判断某个元素中是否可⻅并且是enable的,这样的话才叫clickable

# 元素等待直到元素被加载,为可⻅状态,并且是可点击的状态,才会结束等待
el = WebDriverWait(driver,3).until(ECS.element_to_be_clickable((By.LINK_TEXT,"登录")))


 





                

  • 9
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值