显性期待应用
在应用 WebDriverWait 调用可执行办法,除了可定位的元素,还能够应用 selenium 提供的 expected_conditions 模块中的各种条件,也能够应用 WebElement 的 is_enabled(),is_selected(),is_displayed() 等等办法,还能够应用本人封装的办法。
这次咱们换百度官网测试,首先我先上一段应用显性期待的规范应用形式,这里应用的 LINK_TEXT 查找的元素:
# 导入库from selenium import webdriverfrom selenium.webdriver.support.ui import WebDriverWaitfrom selenium.webdriver.support import expected_conditions as ECSfrom selenium.webdriver.common.by import Byimport time# executable_path 用于指定driver寄存门路browser = webdriver.Chrome(executable_path='/Users/xx/python/chromedriver')# 关上京东官网browser.get('https://www.baidu.com/')# 定位要查找的元素loc = (By.LINK_TEXT, "对于百度")try: # 期待5秒,直到发现元素 WebDriverWait(driver, 5).until(ECS.presence_of_element_located(loc))except: # 没有发现元素则会打印提醒 print("没有找到对应元素!")finally: # 发现元素则执行上面的办法 driver.find_element_by_link_text('对于百度').click()#退出浏览器browser.quit()
显性期待形式介绍
好了,晓得显性期待怎么用了,接下来咱们来看下,还有哪些其余常见的应用形式:
先来个简略的,这里通过页面题目来判断
# 元素期待直到题目呈现 `百度一下,你就晓得` WebDriverWait(driver,3).until(ECS.title_is('百度一下,你就晓得'))# 元素期待直到题目呈现蕴含 `百度` 即可WebDriverWait(driver,3).until(ECS.title_contains('百度'))
通常在网页中并不是所有元素都是可见的,也有的是初始化时不可见,加载实现时则状态又变为可见,所以在元素期待中以下这些形式是常常被用到的。
# 元素期待直到能定位到元素,这里是定位到搜寻输入框# 这里定位时不关怀元素是否可见,只有是加载到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` 应用相似WebDriverWait(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())# 其余都是期待加载元素并操作,这种是期待元素被从Dom中移除时,才会触发完结期待WebDriverWait(driver,3).until(ECS.staleness_of(driver.find_element(By.ID,'su')))# 这种是页面有多个Frame时,期待页面加载直到 `frame1` 能够切换进去,这时就会主动切换到 `frame1` ,而后完结期待WebDriverWait(driver,3).until(ECS.frame_to_be_available_and_switch_to_it(frame1))
除了下面这些,还有很多其余的形式,这里就不再一一列举了,大家有趣味能够本人去钻研一下,而后写些小例子理论应用下。
对了,有小伙伴问如果隐性期待和显性期待都应用了,那它会按哪种形式期待呢?在这里说下,它会按等待时间较长的设置为最终等待时间。
以上就是本次分享的所有内容,想要理解更多 python 常识欢送返回公众号:Python 编程学习圈,每日干货分享