from selenium import webdriver
from selenium.webdriver.support.wait import WebDriverWait
def pageInteraction():
driver = webdriver.Chrome()
driver.get('http://www.baidu.com')
# 隐示等待,为了等待充分加载好网址
driver.implicitly_wait(5) # 隐示等待
write = driver.find_element_by_id("kw")
write.send_keys("Selenium")
# 点击
driver.find_element_by_id('su').click()
try:
# 显示等待,其中5的解释:5秒内每隔0.5毫秒扫描1次页面变化,直到指定的元素
wait = WebDriverWait(driver,5)
wait.until(lambda driver:driver.find_element_by_id("content_left"))
# 打印源代码
# print(driver.page_source)
except Exception as e:
print("查询元素超时", e)
finally:
import time
time.sleep(10)
driver.close()
pageInteraction()
1、显式等待
显示等待:
显示等待是表明某个条件成立才执行获取元素的才做、也可以等待的时候指定一个最大的时间,
如果超过这个时间那么就会抛出一个异常(exceptions.TimeoutException)。
显示等待是应该使用 selenium.webdriver.support.excepted_conditions期望的条件和
selenium.webdriver.support.ui.webDriverWait 来配合完成。
from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait # 显示等待
# 设置等待执行语句
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
driver = webdriver.Chrome()
# driver.implicitly_wait(10) # 隐式等待
driver.get(r'http:\\www.douban.com')
try:
element = WebDriverWait(driver, 10).until(
# 位于...位置存在某个元素
# EC.presence_of_element_located((By.ID, 'form_email')) # 必须是元组
EC.text_to_be_present_in_element(
(By.XPATH, '//div[@class="main"]/div[@class="mod"]/h2[1]'),
'热点内容 • • • • • • ( 更多 )')
)
# element.send_keys('python')
print(element)
finally:
driver.quit()
一个显式等待是你定义的一段代码,用于等待某个条件发生然后再继续执行后续代码。
显式等待是等元素加载!!!
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait # available since 2.4.0
from selenium.webdriver.support import expected_conditions as EC # available since 2.26.0
driver = webdriver.Firefox()
driver.get("http://somedomain/url_that_delays_loading")
try:
element = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.ID, "myDynamicElement")))
finally:
driver.quit()
2、隐式等待
相当于设置全局的等待,在定位元素时,对所有元素设置超时时间。
隐式等待是等页面加载,而不是元素加载!!!(隐式等待就是针对页面的,显式等待是针对元素的)
隐式等待使得WebDriver在查找一个Element或者Element数组时,每隔一段特定的时间就会轮询一次DOM,
如果Element或数组没有马上被发现的话。
默认设置是0。
一旦设置,这个隐式等待会在WebDriver对象实例的整个生命周期起作用。
from selenium import webdriver
driver = webdriver.Firefox()
driver.implicitly_wait(10) # seconds
driver.get(http://www.xxx.com)
myDynamicElement = driver.find_element_by_id("ElementID")
3、强制等待
import time
time.sleep(10)
还不懂?举个简单例子:
你男朋友约你去电影院看电影的时候,在楼下等你:
隐式等待:就是等你化好妆,三十分钟内能下楼就行,但是一定是先化好妆才能下来
显式等待:就不一样了。你男朋友隔五分钟打一次电话,问你好了没?然后说你先下来吧,到我车上化妆,然后人先下去,再车上继续化妆打扮,到电影院时候化妆完成。
你说哪个省时间?
当然是显式等待!!!你就是那个元素,化妆打扮是页面上其它元素。
原文:https://blog.csdn.net/cyjs1988/article/details/76033180