Python+Selenium显示等待操作代码
概念
- 显示等待是针对某一个元素进行相关等待判定;
- 隐式等待不针对某一个元素进行等待,全局元素等待。
相关模块
- WebDriverWait 显示等待针对元素必用
- expected_conditions 预期条件类(里面包含方法可以调用,用于显示等待)
- NoSuchElementException 用于隐式等待抛出异常
- By 用于元素定位
案例:检测百度搜索按钮是否存在,存在的话就输入关键词搜索
显示等待代码如下:
1 # #!/usr/bin/python3 2 # -*- coding: utf-8 -*- 3 # @Time : 2020/7/30 14:49 4 # @Author : Gengwu 5 # @FileName: Element_wait.py 6 # @Software: PyCharm 7 8 from selenium import webdriver #导入webdrive这个类 9 from time import sleep 10 from selenium.webdriver.support.ui import WebDriverWait #注意区分大小写,导入WebDriverWait等待的类 11 from selenium.webdriver.support import expected_conditions as EC #es,expected_conditions首字母,方便调用方法。as取一个别名,调方法的话直接EC. 12 from selenium.webdriver.common.by import By #通过by进行元素定位 13 14 driver=webdriver.Chrome() 15 driver.get(\'https://www.baidu.com/\') 16 driver.maximize_window() #最大化 17 sleep(2) #强制等待2秒 18 19 driver.find_element_by_css_selector(\'#kw\').send_keys(\'selenium 自学网\') 20 21 #当前页面,5s之内,每隔0.5s检测一次id=su的元素。直到查找到 22 #显示等待 23 element=WebDriverWait(driver,5,0.5).until(EC.presence_of_element_located((By.ID,\'su\'))) #搜索框元素的显示等待 until判断条件。跟进id进行定位,调用EC条件类 24 element.click() 25 26 driver.quit()
执行操作运行结果如下:
C:\Users\EDZ\Desktop\selenium_demo\venv\Scripts\python.exe C:/Users/EDZ/Desktop/selenium_demo/webdriver/Element_wait.py
Process finished with exit code 0
可以找到具体元素,操作正常。
假如我们把元素su改成其他的,查看是否找到,具体修改代码段如下:
1 #当前页面,5s之内,每隔0.5s检测一次id=su的元素。直到查找到 2 #显示等待 3 element=WebDriverWait(driver,5,0.5).until(EC.presence_of_element_located((By.ID,\'su123\'))) #搜索框元素的显示等待 until判断条件。跟进id进行定位 4 element.click() 5 6 driver.quit()
执行结果如下:
C:\Users\EDZ\Desktop\selenium_demo\venv\Scripts\python.exe C:/Users/EDZ/Desktop/selenium_demo/webdriver/Element_wait.py Traceback (most recent call last): File "C:/Users/EDZ/Desktop/selenium_demo/webdriver/Element_wait.py", line 23, in <module> element=WebDriverWait(driver,5,0.5).until(EC.presence_of_element_located((By.ID,\'su123\'))) #搜索框元素的显示等待 until判断条件。跟进id进行定位 File "C:\Users\EDZ\Desktop\selenium_demo\venv\lib\site-packages\selenium\webdriver\support\wait.py", line 86, in until raise TimeoutException(message, screen, stacktrace) selenium.common.exceptions.TimeoutException: Message: Stacktrace: Backtrace: Ordinal0 [0x01189563+2725219] Ordinal0 [0x01088551+1672529] Ordinal0 [0x00F70359+525145] Ordinal0 [0x00F09755+104277] Ordinal0 [0x00F253C0+218048] Ordinal0 [0x00F1AAD0+174800] Ordinal0 [0x00F23D7C+212348] Ordinal0 [0x00F1A94B+174411] Ordinal0 [0x00F02528+75048] Ordinal0 [0x00F035A0+79264] Ordinal0 [0x00F03539+79161] Ordinal0 [0x0109D607+1758727] GetHandleVerifier [0x012A6546+1050150] GetHandleVerifier [0x012A6291+1049457] GetHandleVerifier [0x012B10D7+1094071] GetHandleVerifier [0x012A6B46+1051686] Ordinal0 [0x01095B06+1727238] Ordinal0 [0x0109EB7B+1764219] Ordinal0 [0x0109ECE3+1764579] Ordinal0 [0x010B4C05+1854469] BaseThreadInitThunk [0x777C6359+25] RtlGetAppContainerNamedObjectPath [0x77B67C24+228] RtlGetAppContainerNamedObjectPath [0x77B67BF4+180]
会看到报错信息:
TimeoutException,时间超时,因为再5秒内找不到su123这个元素。
百度搜索对应源码如下
以上有问题欢迎随时沟通交流!
Best Regards!