本文转载自微信公众号《Python技术》,作者:帕森酱。转载本文请联系Python技术公众号。上次介绍了Selenium元素等待的三种方式,每种元素等待方式的优缺点,以及在使用场景下如何操作。并写了一些具体使用的简单例子,供大家参考。在后台看到大家对explicitwaiting很感兴趣,想进一步了解它的使用方法,所以今天继续给大家详细介绍一下。显式等待使用WebDriverWait调用可执行方法。除了可定位元素,还可以使用selenium提供的expected_conditions模块中的各种条件,或者使用WebElement的is_enabled()、is_selected()、is_displayed()等方法,也可以使用自己封装的方法。这次换成百度官网测试,首先我会使用上一段显式等待的标准使用方式,这里使用的LINK_TEXT元素:#importlibraryfromseleniumimportwebdriverfromselenium.webdriver.support.uiimportWebDriverWaitfromselenium.webdriver.supportimportexpected_conditionsasECSfromselenium.webdriver.common.byimportByimporttime#executable_path用于指定驱动存放路径browser=webdriver.Chrome(executable_path='/Users/xx/python/chromedriver')#打开京东官网browser.get('https://www.baidu.com/')#location要查找的元素loc=(By.LINK_TEXT,"AboutBaidu")try:#等待5秒直到找到元素WebDriverWait(driver,5).until(ECS.presence_of_element_located(loc))except:#如果没有找到元素,会打印提示print("没有找到对应的元素!")finally:#如果找到元素,执行下面的方法driver.find_element_by_link_text('关于百度')。点击()#退出浏览器browser.quit()显式等待方法介绍OK现在,我知道如何使用显式等待了。接下来我们看看其他常见的使用方式:先从一个简单的开始,这里我们通过页面标题来判断#elementwaituntiltitleappears`Baidu,you'llKnow`WebDriverWait(driver,3).until(ECS.title_is('Baidu,你就知道'))#元素等到标题出现包含`Baidu`WebDriverWait(driver,3).until(ECS.title_contains('Baidu'))通常不是所有元素都可见在一个网页中,有些在初始化的时候是不可见的,加载完成后状态又变得可见了,所以在元素等待的时候经常使用下面的方法。#元素等待元素可以定位,这里是定位搜索输入框#这里定位的时候,不关心元素是否可见,只要加载到DOM中就可以定位WebDriverWait(driver,3).until(ECS.presence_of_element_located((By.ID,'kw')))#元素等待直到可以定位到一个可见的元素,例如搜索按钮位于此处#与上面不同的是,这里的waiting元素除了加载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((经过。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'),'百度一下'))下面的方法主要针对等待下拉框类型,以及可点击的组件,比如hyperlinks#Elements等到元素加载完毕,可见,并且它是可点击的,将结束等待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())#其他等待元素加载运行。这个在等待元素显示时从Dom中移除,会触发结束等待WebDriverWait(driver,3).until(ECS.staleness_of(driver.find_element(By.ID,'su')))#这是当页面有多个Frames时,等待页面加载到`frame1`可以切换进来,然后会自动切换到`frame1`,然后结束等待WebDriverWait(driver,3).until(ECS.frame_to_be_available_and_switch_to_it(frame1))除了上面的,还有很多其他的方式,这里就不一一列举了。有兴趣的可以自己研究一下,然后写一些小例子练习一下使用是否正确。有朋友问如果同时使用隐式等待和显式等待,会用哪种方式等待?这里会根据等待时间长的来设置最后的等待时间。综上所述,今天我们介绍一下Selenium显式等待元素加载的方式,详细介绍并列举一些常见场景的例子,供大家参考,后续还会介绍更多。
