【selenium元素定位】三种等待方式的举例详解

在使用selenium做自动化时,经常遇到一些要等待页面元素加载完成后才能对元素进行操作,否则会报错:Message: no such element: Unable to locate element,对于这样的场景,可以对页面加载做个等待时间。
1、强制等待

利用time模块的sleep方法来实现页面加载等待时间,强制等待。
这种方法不管你浏览器是否加载完成,都得给我等待3秒,3秒一到,继续执行下面的代码,不建议用这种等待方法,严重影响代码的执行速度

# coding = utf-8
from time import sleep
from selenium import webdriver
# 驱动文件路径
driverfile_path = r'D:\....\drivers\chromedriver.exe'
# 启动浏览器
browser = webdriver.Chrome(executable_path=driverfile_path)
# 打开百度首页
browser.get(r'https://www.baidu.com/')
# 等待3秒
sleep(3)
browser.find_element_by_id("kw").send_keys("selenium")
browser.find_element_by_id('su').click()
# 退出
browser.quit()
2、隐式等待

设置一个等待时间,如果在这个等待时间内,网页加载完成,则执行下一步;否则一直等待时间截止,然后再执行下一步。这样也就会有个弊端,程序会一直等待整个页面加载完成,直到超时,但有时候我需要的那个元素早就加载完成了,只是页面上有个别其他元素加载特别慢,我仍要等待页面全部加载完成才能执行下一步。

# coding = utf-8
from selenium import webdriver
# 驱动文件路径
driverfile_path = r'D:\....\drivers\chromedriver.exe'
# 启动浏览器
browser = webdriver.Chrome(executable_path=driverfile_path)
# 打开百度首页
browser.get(r'https://www.baidu.com/')
browser.find_element_by_id("kw").send_keys("selenium")
browser.find_element_by_id('su').click()
# 隐式等待30秒
browser.implicitly_wait(30)
result = browser.find_elements_by_css_selector("h3.t>a")
for i in result:
    print(i.text)
# 退出
driver.quit()
3、显示等待

可以通过Python源码查看具体应用及语法结构等;
Args:

  • driver - 浏览器驱动
  • timeout - 超时前的秒数
  • poll_frequency - 时间隔间的秒数,默认0.5s
  • ignored_exceptions - 调用期间忽略的异常类的可迭代结构。默认情况下,它仅包含NoSuchElementException
  • 列子:
# 超时时间为10秒,每0.5秒(默认)检查1次,直到id="someId"的元素出现
element = WebDriverWait(driver, 10).until(lambda x: x.find_element_by_id("someId"))
# 超时时间为30秒,每1秒检查1次,判断id = “someId” 元素是否消失,如果消失是返回Ture,否返回False 
is_disappeared = WebDriverWait(driver, 30, 1, (ElementNotVisibleException)).until_not(lambda x: x.find_element_by_id("someId").is_displayed())

【selenium元素定位】三种等待方式的举例详解_第1张图片

# coding = utf-8
from selenium import webdriver
from selenium.webdriver.support.wait import WebDriverWait
# 驱动文件路径
driverfile_path = r'D:\coship\Test_Framework\drivers\chromedriver.exe'
# 启动浏览器
browser = webdriver.Chrome(executable_path=driverfile_path)
# 打开百度首页
browser.get(r'https://www.baidu.com/')
browser.find_element_by_id("kw").send_keys("selenium")
browser.find_element_by_id('su').click()
# 超时时间为30秒,每0.2秒检查1次,直到class="tt"的元素出现
text = WebDriverWait(browser,30,0.2).until(lambda x:x.find_element_by_css_selector(".tt")).text
print(text)
# 退出
browser.quit()

你可能感兴趣的:(Python,自动化测试框架,selenium,selenium,python,chrome)