元素操作(一)
一. 如何處理首次登陸的引導頁面
refresh():頁面刷新。可以再瀏覽器中刷新一下,就可以取消引導頁
二. 操作頁面彈出框中的元素
1. 強制等待 sleep(秒)
比如百度首頁的登錄彈出框,在訪問百度的時候,它就在html頁面中出現了,只不過默認display:none,沒有展示而已(這種彈出框只是修改display屬性為block,所以系統響應應該非常快),對於這種情況,需要等待彈出框出現,才能進行下一步操作,所以需要設置等待時間
訪問百度首頁登錄代碼如下:
from selenium import webdriver import time #初始化chromedriverdriver = webdriver.Chrome() #驅動瀏覽器訪問百度首頁 driver.get("http://www.baidu.com") #利用xpath定位百度首頁的登錄,並點擊 driver.find_element_by_xpath("//*[@id=‘u1‘]//a[@name=‘tj_login‘]").click() #強制等待2s time.sleep(2) #利用id定位用戶名登錄,並點擊 driver.find_element_by_id("TANGRAM__PSP_10__footerULoginBtn").click()
還有一種情況,提交表單數據後,會看到一個進度條,這意味著系統正與服務器進行交互,只有交互之後,才能看到頁面的變化。這時候,就不能確定加載時間是多少,因為和網絡、服務器的性能有關。這裏就要用到隱性等待
2. 隱性等待 implicitly_wait(秒)
設置最長等待時間,在這個時間內加載完成,則執行下一步,比如設置30s隱性等待,在3s內就能切換到頁面,就不會再繼續等下去,而是進入下一步
整個driver的會話(從建立連接到斷開連接 )周期內,設置一次即可,全局都可用
繼續用上面的例子做修改,修改後的百度登錄代碼如下:
from selenium import webdriver #初始化chromedriver,建立連接 driver = webdriver.Chrome() #隱性等待30s,應該在建立連接之後設置 driver.implicitly_wait(30)#驅動瀏覽器訪問百度首頁 driver.get("http://www.baidu.com") #利用xpath定位百度首頁的登錄,並點擊 driver.find_element_by_xpath("//*[@id=‘u1‘]//a[@name=‘tj_login‘]").click() #利用id定位用戶名登錄,並點擊 driver.find_element_by_id("TANGRAM__PSP_10__footerULoginBtn").click() #斷開連接,必須用driver.quit()而非close() #driver.quit()
註意:觀察到當python腳本運行結束時,進程中的chromedriver.exe會消失,但這並不意味著會話的結束,一個會話的結束是以關閉瀏覽器,斷開連接為標準的(chromedriver.exe進程,在會話當中很重要,是一部分,但並不是全部。所以即便chromedriver.exe沒了,會話仍然沒有正確結束。因為除了啟動chromedriver.exe之外,還有其它初始化的配置項)
另一種更高級的情況是,我在百度裏搜索"selenium",需要等到另外一個頁面的彈出框出現之後,才會對它進行操作,這時需要用到顯性等待
3. 顯性等待
明確等到某個條件滿足之後,再去執行下一步的操作
程序每隔xx秒看一眼,如果條件成立了,則執行下一步,否則繼續等待,直到超過設置的最長時間,然後拋出TimeoutException
WebDriverWait類:顯性等待類
WebDriverWait(driver, 等待時長, 輪詢周期).until/until_not
-
driver:表示本次會話中的driver
-
等待時長:最長的等待時間
-
輪詢周期:多久去看一眼
-
until:直到條件成立;until_not:直到條件不成立
Expected_conditions類:提供了一系列周期發生的條件
presence_of_element_located:元素存在
visibility_of_element_located:元素可見
element_to_be_clickable:元素可點擊
ps:這個類有很多判斷方法,具體自行了解
使用之前,引入相關的庫:
from selenium.webdriver.support.wait import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.common.by import By
使用方法:
1) 先確定元素的定位表達式 web_locator=‘XXXX‘
2) 調用WebDriverWait類設置等待總時長、輪詢周期,並調用其until、until_not方法
WebDriverWait(webdriver對象名, 等待總時長, 輪詢周期).until(判斷條件)
3) 使用expected_conditions對應的方法來生成判斷條件
EC.方法名((定位方式, 定位表達式))
如:EC.presence_of_element_located((By.CSS_SELECTOR, web_locator))
繼續修改上面的代碼,如下所示:
from selenium import webdriver from selenium.webdriver.support.wait import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.common.by import By #初始化chromedriver,建立連接 driver = webdriver.Chrome() #驅動瀏覽器訪問百度首頁 driver.get("http://www.baidu.com") #利用xpath定位百度首頁的登錄,並點擊 driver.find_element_by_xpath("//*[@id=‘u1‘]//a[@name=‘tj_login‘]").click() #1. 先確定要找的元素的表達式 2.設置WebDriverWait類的參數和條件 login_popup_id = "TANGRAM__PSP_10__footerULoginBtn" WebDriverWait(driver, 10, 1).until(EC.visibility_of_element_located((By.ID, login_popup_id))) #元素可見的話再點擊 driver.find_element_by_id(login_popup_id).click()
元素操作(一)