解决网页加载缓慢的几种方法:
一、显性等待WebDriverWait,配合该类的until()和until_not()方法,就能够根据判断条件而进行灵活地等待
1 from selenium import webdriver2 from selenium.webdriver.support.wait import WebDriverWait3 4 driver = webdriver.Firefox()5 driver.get("https://www.baidu.com/")6 # 等待时长30秒,默认每0.5秒询问一次7 WebDriverWait(driver, 30).until(lambda x: x.find_element_by_id("kw")).send_keys("sky")8 # sel_count_info = WebDriverWait(driver, 30).until(lambda x: x.find_element_by_id("selCount")).text
WebDriverWait(driver, 超时时长, 调用频率, 忽略异常).until(可执行方法, 超时时返回的信息)
WebDriverWait(driver, 超时时长, 调用频率, 忽略异常).until_not(可执行方法, 超时时返回的信息)
可以用selenium提供的 expected_conditions 模块中的各种条件,也可以用WebElement的 is_displayed() 、is_enabled()、is_selected() 方法,或者用自己封装的方法都可以
二、强制等待 sleep(xx),不建议总用这种等待方式,太死板,严重影响程序执行速度
1 from selenium import webdriver2 from selenium.webdriver.support.wait import WebDriverWait3 4 driver = webdriver.Firefox()5 driver.get("https://www.baidu.com/")6 # 强制等待时长5秒7 driver.find_element_by_id("kw").send_keys("sky")
三、隐性等待implicitly_wait(xx),隐性等待对整个driver的周期都起作用,所以只要设置一次即可
1 from selenium import webdriver 2 3 driver = webdriver.Firefox() 4 # 隐性等待,最长等30秒 5 driver.implicitly_wait(30) 6 driver.get('https://huilansame.github.io')
四、隐性显性并用
1 from selenium import webdriver 2 from selenium.webdriver.support.wait import WebDriverWait 3 from selenium.webdriver.support import expected_conditions as EC 4 from selenium.webdriver.common.by import By 5 driver = webdriver.Firefox() 6 driver.implicitly_wait(10) # 隐性等待和显性等待可以同时用,但要注意:等待的最长时间取两者之中的大者 7 driver.get('https://huilansame.github.io') 8 locator = (By.LINK_TEXT, 'CSDN') 9 try: 10 WebDriverWait(driver, 20, 0.5).until(EC.presence_of_element_located(locator)) 11 print(driver.find_element_by_link_text('CSDN').get_attribute('href')) 12 finally: 13 driver.close()