python3+selenium入门07-元素等待

在使用selenium进行操作时,有时候在定位元素时会报错。这可能是因为元素还没有来得及加载导致的。可以等过元素等待,等待元素出现。有强制等待,显式等待,隐式等待。

 

强制等待

就是之前文章中的time.sleep(),只是为了看到界面操作效果才那样设置的。这个是不管找没找到都会等待的。基本代码中不会用这个。

 

 

显式等待

WebDriverWait类是WebDriver提供的等待方法。在设置的时间内,会每隔一段时间去检查一次当前页面元素是否存在,如果超过设置时间还没有见到到就抛出异常。具体格式如下:

需要先导入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:报错信息,默认抛出NoSuchElementException

一般是配合until()和until_not()方法使用

until():可以传两个参数,第一个参数是判断条件,直到第一个参数返回True。第二个参数可以写文字说明。

until_not():可以传两个参数,第一个参数是判断条件,直到第二个参数返回False。第二个参数可以写文字说明

expected_conditions类下提供预期条件判断方法,具体有哪些方法可以自己查下,以title_is()方法举例,对比title是否正确的。

需要先导入from selenium.webdriver.support import expected_conditions

from selenium import webdriver
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions
dr = webdriver.Chrome()
dr.maximize_window()
dr.get("https://www.baidu.com")#打开百度
tr = dr.title#获取title
wait = WebDriverWait(dr,10)#实例化显示等待,设置等待时间10秒
s = wait.until_not(expected_conditions.title_is(tr),'出错了')#对比title
print(s)

因为title肯定一致,返回的是True,所以until_not()肯定不会对。会一直等待着,直到10秒结束。可以改成until()再看下。

 

 

隐式等待

WebDriver类下的implicitly_wait()方法可以设置隐式等待。这个只会在脚本进行元素定位相关的时候执行,会在设置的时间内不断的判断这个元素是否被找到了

from selenium import webdriver
from time import ctime
dr = webdriver.Chrome()
dr.maximize_window()
dr.implicitly_wait(10)
try:
    dr.get("https://www.baidu.com")#打开百度
    print(ctime())
    tr = dr.find_element_by_id('kw123')
except BaseException as f:
    print(f)
    print(ctime())
finally:
    dr.close()

因为没有一个id是叫kw123,所以肯定会找不到,通过秒数可以看到等待了10秒。

一般这个用的比较多,在浏览器初始化之后设置。之后所有定位元素的操作,都会有等待时间的设置。

posted @ 2018-07-26 20:53  梦忆安凉  阅读(383)  评论(0编辑  收藏  举报