美文网首页
selenium三种等待方式

selenium三种等待方式

作者: cain07 | 来源:发表于2021-12-02 14:28 被阅读0次

    selenium三种等待方式

    很多时候,我们进行元素定位时无法按预期成功定位到元素,但是我们的代码又确保准确无误,那是什么原因呢?

    其实,原因很简单,大致分为2种:
    1,所定位的元素在frame/iframe中
    2,未设置合理的等待

    为什么未设置合理等待的时候,很有可能无法正确定位元素呢?
    我们知道,代码的执行速度很快很快,但浏览器的渲染速度却相对慢了很多,这就容易导致代码执行完后还未渲染或加载成功过,从而导致无法成功定位元素。

    等待分为3种:
    1,强制等待
    2,隐式等待
    3,显示等待

    1,强制等待
    强制等待是最为粗暴的一种等待方式,此等待方式不管定位结果如何都会一直等待,直到等待时长结束。此种等待方式会导致程序代码中断,当等待时间结束
    后才会继续往下执行。
    所以,此种等待方式往往会拉低程序执行效率,拉长了测试时长。
    在python种,强制等待用sleep()方法,使用此方法需导入time(import)模块或time模块中的sleep()方法(from time import sleep)。

    from selenium import webdriver 
    from selenium.webdriver.common.by import By 
    from time import sleep
    
    driver = webdriver.Firefox()
    driver.get("http://www.baidu.com")
    sleep(3)
    driver.find_element(By.ID, 'kw').send_keys("python")
    driver.find_element(By.ID, 'su').click()
    sleep(3)
    driver.quit()
    
    

    上图代码中,在打开了百度首页后,sleep3秒,在搜索完成后sleep3秒。

    2,隐式等待:implicitly_wait(xx)
    隐私等待会在等待时长内等待整个页面的加载完成,如果在等待时长内页面加载完成,则进行下一步。否则会一直等待页面加载完成,直到达到等待时长。
    隐式等待的一个明显弊端:一定会等到页面加载完成后才会执行下一步,即使可能元素已经被找到了。
    注意:
    隐性等待对整个driver的周期都起作用,所以只要设置一次即可。

    from selenium import webdriver 
    from selenium.webdriver.common.by import By
    
    driver = webdriver.Firefox()
    driver.get("http://www.baidu.com")
    driver.implicitly_wait(10)
    driver.find_element(By.ID, "kw").send_keys("python")
    driver.find_element(By.ID, 'su').click()
    

    既然,隐式等待也可能会导致我们的程序运行速度变慢,那有没有更好的等待方式呢?当然,显示等待就可以。

    3,显示等待:WebDriverWait,配合该类的until()和until_not()方法 显示等待会在一定的时间频率上来查看是否定位到了元素,若找到了元素则进行下一步。若未找到,则超时后抛出异常:TimeoutException
    WebDriverWait类需要导入:from selenium.webdriver.support.wait import WebDriverWait
    WebDriverWait()对象需3个参数:driver, timeout,poll_frequency=POLL_FREQUENCY。
    其中:driver为浏览器驱动,timeout为超时时间,poll_frequency为查询频率。
    EC为exceped_conditions模块(缩写)调用presence_of_element_located()来判断元素是否已经在页面的DOM中(不需要元素在页面是
    可见的),在则返回WebElement对象。

    from selenium import webdriver
    from selenium.webdriver.common.by import By 
    from selenium.webdriver.support.wait import WebDriverWait 
    from selenium.webdriver.support import expected_conditions as EC
    
    driver = webdriver.Firefox()
    driver.get("http://www.baidu.com")
    ele = WebDriverWait(driver,10,0.5).until(EC.presence_of_element_located((By.ID, 'kw')))
    ele.send_keys("python")
    
    

    从上面示例,会在等待时长10s内,以0.5s的评论查询是否定位到元素(By.ID,'kw'),若定位到元素则停止等待执行下一步,若为找到则抛出
    异常。
    除了until(),还可以结合until_not()来使用。

    重点:理解并熟练使用显示等待,并对涉及到的WebDriverWait类,excepted_conditions模块理解充分。 在webUI自动化中,会对元素的定位进行二次封装,而通常元素的定位就会用到显示等待,并结合try...except来捕获异常。

    https://www.cnblogs.com/ctltest/p/14480682.html

    相关文章

      网友评论

          本文标题:selenium三种等待方式

          本文链接:https://www.haomeiwen.com/subject/hllyxrtx.html