1. 程式人生 > >元素操作(一)

元素操作(一)

ram enc 元素 訪問 rda css log chrome 初始

一. 如何處理首次登陸的引導頁面

refresh():頁面刷新。可以再瀏覽器中刷新一下,就可以取消引導頁

二. 操作頁面彈出框中的元素

1. 強制等待 sleep(秒)

比如百度首頁的登錄彈出框,在訪問百度的時候,它就在html頁面中出現了,只不過默認display:none,沒有展示而已(這種彈出框只是修改display屬性為block,所以系統響應應該非常快),對於這種情況,需要等待彈出框出現,才能進行下一步操作,所以需要設置等待時間

技術分享圖片

訪問百度首頁登錄代碼如下:

from selenium import webdriver
import time

#初始化chromedriver
driver = 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()

元素操作(一)