WebDriverWait 显示等待 +lambda匿名函数
sleep后会影响脚本的执行速度,虽然implicitly_wait()这种方法隐式等待方法一定程度上节省了很多时间。
但是一旦页面上某些js无法加载出来(其实界面元素经出来了),左上角那个图标一直转圈,这时候会一直等待的。
一、参数解释
1.这里主要有三个参数:
class WebDriverWait(object):driver, timeout, poll_frequency
2.driver:返回浏览器的一个实例,这个不用多说
3.timeout:超时的总时长
4.poll_frequency:循环去查询的间隙时间,默认0.5秒
以下是源码的解释文档(案例一个是元素出现,一个是元素消失)
def __init__(self, driver, timeout, poll_frequency=POLL_FREQUENCY, ignored_exceptions=None):
"""Constructor, takes a WebDriver instance and timeout in seconds.
:Args:
- driver - Instance of WebDriver (Ie, Firefox, Chrome or Remote)
- timeout - Number of seconds before timing out
- poll_frequency - sleep interval between calls
By default, it is 0.5 second.
- ignored_exceptions - iterable structure of exception classes ignored during calls.
By default, it contains NoSuchElementException only.
Example:
from selenium.webdriver.support.ui import WebDriverWait \n
element = WebDriverWait(driver, 10).until(lambda x: x.find_element_by_id("someId")) \n
is_disappeared = WebDriverWait(driver, 30, 1, (ElementNotVisibleException)).\ \n
until_not(lambda x: x.find_element_by_id("someId").is_displayed())
"""
二,例子
1,元素出现until()例子:
from seleniumimport webdriver
from selenium.webdriver.support.uiimport WebDriverWait
path ="D:\\XXX\\chromedriver.exe"
driver = webdriver.Chrome(path)
driver.maximize_window()
driver.get("http://www.baidu.com")
WebDriverWait(driver,10).until(lambda x:x.find_element_by_id("kw")).send_keys("yoyo")
2,元素消失:until_not()例子
is_disappeared = WebDriverWait(driver, 10,1).until_not(lambda x:x.find_element_by_id("kw").is_displayed())
print(is_disappeared)
运行后因为页面元素“kw”并未消失,所以报错,如下:
Python 中,lambda 函数是用一个语句表达的匿名函数。可以用它来代替小的函数。
首先,举一个使用普通函数的例子。定义函数edit_story(),参数列表如下所示:
• words——单词列表
• func——遍历列表中单词的函数
>>> def edit_story(words, func):
... for word in words:
... print(func(word))
现在,需要一个单词列表和一个遍历单词的函数。对于单词,可以选择我的猫从某一台阶
上掉下时发出的声音:
>>> stairs = ['thud', 'meow', 'thud', 'hiss']
对于函数,它要将每个单词的首字母变为大写,然后在末尾加上感叹号 , 用作猫画报的标
题非常完美:
>>> def enliven(word): # 让这些单词更有情感
... return word.capitalize() + '!'
混合这些“配料”:
>>> edit_story(stairs, enliven)
Thud!
Meow!
Thud!
Hiss!
最后,到了lambda。enliven() 函数可以简洁地用下面的一个lambda 代替:
>>>
>>> edit_story(stairs, lambda word: word.capitalize() + '!')
Thud!
Meow!
Thud!
Hiss!
>>>
lambda 函数接收一个参数word。在冒号和末尾圆括号之间的部分为函数的定义。
通常,使用实际的函数(例如enliven())会比使用lambda 更清晰明了。但是,当需要定
义很多小的函数以及记住它们的名字时,lambda 会非常有用。尤其是在图形用户界面中,
可以使用lambda 来定义回调函数。
显示等待WebDriverWait