显性等待是使用WebDriverWait调用可执行方法。除了可定位元素,还可以使用selenium提供的expected_conditions模块中的各种条件,或者使用WebElement的is_enabled()。is_selected()、is_displayed()等方法也可以使用自己封装的方法。这次我们换到百度官网进行测试。首先,我将使用上一节显式等待的标准使用方法。这里使用的LINK_TEXT元素是:#importlibraryfromseleniumimportwebdriverfromselenium.webdriver.support.uiimportWebDriverWaitfromselenium.webdriver。支持importexpected_conditionsasECSfromselenium.webdriver.common.byimportByimporttime#executable_path用于指定驱动存放路径browser=webdriver.Chrome(executable_path='/Users/xx/python/chromedriver')#打开京东官网browser.get('https://www.baidu.com/')#定位要查找的元素loc=(By.LINK_TEXT,"AboutBaidu")try:#等待5秒直到找到元素WebDriverWait(driver,5).until(ECS.presence_of_element_located(loc))except:#如果没有找到元素,打印提示print("Nocorrespondingelementfound!")finally:#如果找到元素,下面的方法将被执行driver.find_element_by_link_text('AboutBaidu').click()#退出浏览器browser.quit()显式等待方法介绍,我们就知道显式等待的使用方法了。接下来我们看看其他常见的使用方法:先从一个简单的开始,这里通过页面的标题判断#元素等到标题出现`百度一下就知道了`WebDriverWait(driver,3).until(ECS.title_is('Baidu,you'llknow'))#元素等到title中包含`Baidu`即WebDriverWait(driver,3).until(ECS.title_contains('Baidu'))通常不是所有元素在网页中是可见的,有些在初始化、加载时是不可见的当它完成后,状态又变成可见的,所以在元素等待中经常使用下面的方法#元素一直等到可以定位到元素,这里是搜索输入框#这里定位时不关心元素是否可见,只要加载到DOM中就可以定位WebDriverWait(driver,3).until(ECS.presence_of_element_located((By.ID,'kw')))#元素等待,直到可以定位到一个可见的元素,例如搜索按钮位于这里#与上面不同的是,这里的等待元素必须除了加载DOM之外是可见的WebDriverWait(driver,3).until(ECS.visibility_of_element_located((By.ID,'su')))#元素等待直到可以定位可见元素,例如搜索框位于此处#此方法类似于上面的`visibility_of_element_located`usingWebDriverWait(driver,3).until(ECS.visibility_of((By.ID,value='su')))#元素等待直到至少一个元素存在通过`CSS`定位,然后结束等待WebDriverWait(driver,3).until(ECS.presence_of_all_elements_located((By.CSS_SELECTOR,'.uinv')))#这个和前面的等待方法类似,主要是元素需要可见才会等待结束WebDriverWait(driver,3).until(ECS.visibility_of_any_elements_located((By.CSS_SELECTOR,'.uinv')))#元素等待,直到元素加载完毕,可以定位,且元素必须不可见,然后等待结束WebDriverWait(driver,3).until(ECS.invisibility_of_element_located((By.CSS_SELECTOR,'#nwWrap')))在正常使用中,常用于判断等待元素是否包含某些内容,该方法可以应用于很多场景元素的属性值包含WebDriverWait(driver,3).until(ECS.text_to_be_present_in_element((By.XPATH,"//*[@id='bottom_layer']/div/p[1]/a"),'关于百度'))#这个实现类似于上面的效果WebDriverWait(driver,3).until(ECS.text_to_be_present_in_element_value((By.CSS_SELECTOR,'#su'),'百度一下'))下面的方法主要是针对下拉框类型的等待,以及可点击的组件,比如超链接#元素等到元素加载完成,就是可见,并且是可用的点击状态会结束等待WebDriverWait(driver,3).until(ECS.element_to_be_clickable((By.XPATH,"//*[@id='bottom_layer']/div/p[1]/a")).click()#元素等待,直到元素加载、可见且元素被选中#该方法用在下拉选择框WebDriverWait(driver,3).until(ECS.element_to_be_selected((By.XPATH,"//*[@id='sel']/option[2]"))#等待元素加载完毕,元素的选中状态为预期状态,然后它将结束等待WebDriverWait(driver,3).until(ECS.element_selection_state_to_be((By.XPATH,"//*[@id='sel']/option[1]"),False))下面是一些特殊的方式,在某些情况下很有用#非常大的元素等待直到页面加载出来出现`alert`,然后自己切换,返回提示内容给WebDriverWait(driver,3).until(ECS.alert_is_present())#其他人在等待加载元素和操作,这是Waitingforthe要从Dom中移除的元素将触发等待结束WebDriverWait(driver,3).until(ECS.staleness_of(driver.find_element(By.ID,'su')))#这是一个有多个WhenFrame的页面,等待页面加载,直到可以切换到`frame1`,然后会自动切换到`frame1`,然后完成等待WebDriverWait(driver,3).until(ECS.frame_to_be_available_and_switch_to_it(frame1))除了上面的,还有很多其他的方式,这里就不一一列举了。有兴趣的可以自己研究一下,然后写一些小例子的实际使用才是正确的。有朋友问如果同时使用隐式等待和显式等待,会用哪种方式等待?这里根据等待时间长的设置为最终等待时间。以上就是本次分享的全部内容。想了解更多python知识,请前往公众号:Python编程学习圈,每日干货分享
