1. 程式人生 > 其它 >Selenium Webdriver常用方法

Selenium Webdriver常用方法

目錄[-]

例項化方法

from selenium import webdriver
driver = webdriver.Chrome(executable_path='C:Program Files (x86)GoogleChromeApplicationchromedriver')

瀏覽器操作

  • 瀏覽器最大化
driver.maximize_window()
  • 設定瀏覽器寬高
driver.set_window_size(480, 800)
  • 控制瀏覽器前進後退
driver.back() 
driver.forward()

簡單物件定位

get_element_by_id()  # id
get_element_by_name()  # name
get_element_by_class_name()  # class_name
get_element_by_tag_name()  # tag_name
get_element_by_link_text()  # link_text
get_element_by_partial_link_text()  #  部分link_text
get_element_by_xpath()  # xpath定位
get_element_by_link_text()  # link_text
find_element_by_css_selector()  # css定位

操作Element物件

find_element_by_id("user_name").clear()  # 清楚元素內容
find_element_by_id("user_name").send_keys("username")  # 按鍵輸入
find_element_by_id("dl_an_submit").click()  # 單機元素
find_element_by_id("dl_an_submit").submit()  # 提交表單
  • Element常用方法
driver.find_element_by_name('tj_trnews').size  # 元素尺寸
driver.find_element_by_name('tj_trnews').text  # 返回元素文字
driver.find_element_by_name('tj_trnews').get_attribute('class')  # 獲取屬性值
driver.find_element_by_name('tj_trnews').is_displayed()  # 是否使用者可見

滑鼠事件

from selenium.webdriver.common.action_chains import ActionChains

 el = driver.find_element_by_name('tj_trnews')  # 目標元素

ActionChains(driver).context_click(el).perform()  # 右擊目標元素
ActionChains(driver).double_click(el).perform()  # 雙擊目標元素

source = driver.find_element_by_id('lg')   # 目標元素原始位置
target = driver.find_element_by_id('kw')  # 拖動的目標位置
ActionChains(driver).drag_and_drop(source, target).perform()  # 拖動元素

ActionChains(driver).move_to_element(el).perform()  # 滑鼠移動的目標元素上
ActionChains(driver).click_and_hold(el).perform()  # 移動到目標元素按下滑鼠左鍵

鍵盤事件

from selenium.webdriver.common.keys import Keys

driver.get("https://www.baidu.com/")
driver.find_element_by_id("kw").send_keys("selenium")  # 輸入框輸入內容
driver.find_element_by_id("kw").send_keys(Keys.BACK_SPACE)  # 從後刪除一個字元(刪除鍵)
driver.find_element_by_id("kw").send_keys(Keys.SPACE)  # 輸入空格
driver.find_element_by_id("kw").send_keys(Keys.CONTROL,'a')  # ctrl + a 全選輸入框內容 
driver.find_element_by_id("kw").send_keys(Keys.CONTROL,'x')  # ctrl + x 剪下輸入框內容
driver.find_element_by_id("kw").send_keys(Keys.CONTROL,'v')  # ctrl + v 貼上
driver.find_element_by_id("su").send_keys(Keys.ENTER)  # 回車

設定等待時間

有時候網頁載入比較慢,如果程式沒有等待就可能出現定位不到的情況。

  • 強制等待sleep() 強制等待比較暴力,呼叫time模組的sleep()方法強制讓程式等待。
  • 隱性等待implicitly_wait() iimplicitly_wait()是設定了最大等待時間,如果在規定時間內載入完成,則繼續執行下面操作,否則一直等到時間截止再執行下一步。但是這種也有一個弊端,那就如果你需要的元素已經加載出來了,但是頁面整體還沒有載入完成,程式也會一直等待,也並不智慧。
  • 顯性等待WebDriverWait() 它是需要傳入一個判斷條件的匿名函式,每隔一段時間去判斷條件函式,如果條件成立則繼續下一步,如果不成立則繼續等待。
from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
import time

driver = webdriver.Firefox()
driver.get("http://www.baidu.com")

# 強制等待
time.sleep(5)

# 隱形等待
driver.implicitly_wait(30)

# 顯性等待
element=WebDriverWait(driver, 10).until(lambda driver:driver.find_element_by_id("kw"))  # 當找到id為kw的元素時才執行下一步。超時時間為10秒,預設每0.5秒檢測一次。

定位frame中的物件

對於frame巢狀的網站,一般只能操作外層的元素,如果需要進入frame內層就需要呼叫switch_to.frame()方法。

driver.switch_to.frame()
frame方法接收三種引數:frame name、index 和webelement
driver.switch_to.frame('frame_name')
driver.switch_to.frame(1)
driver.switch_to.frame(driver.find_elements_by_tag_name("iframe")[0])

多視窗切換

要想在多個視窗之間切換,首先要獲得每一個視窗的唯一識別符號號(控制代碼)。通過獲得的控制代碼來區別分不同的視窗,從而切換不同窗。

driver.get("http://example.com")  # 開啟一個視窗
now_handle = drvier.current_window_handle  # 獲取當前視窗控制代碼

driver.find_element_by_name('example').click()  # 點選某個元素開啟新的視窗(target="_black"的元素)
all_handle = drvier.window_handles  # 獲取所有視窗控制代碼
drvier.switch_to.window(now_handle)  # 切換為第一視窗
driver.close()  # 關閉當前視窗

下拉框處理

webdriver處理下拉框首先定位到下拉框內容,然後click某個option即可

m=driver.find_element_by_id("ShippingMethod")  # 首先定位到下拉框
m.find_element_by_xpath("//option[@value='10.69']").click()  # 然後點選下拉框選項

執行JavaScrapt

driver.execute_script('Java Scrapt Code')

# 例如下拉瀏覽器滾動條
driver.execute_script('window.scrollTo(0, document.body.scrollHeight)')

Cookie處理

webdriver可以對cookie進行讀取、增加、刪除

get_cookies()   # 獲得所有 cookie 資訊
get_cookie(name)   # 返回特定 name 有 cookie 資訊
add_cookie(cookie_dict)   # 新增 cookie,必須有 name 和 value 值
delete_cookie(name)   # 刪除特定(部分)的 cookie 資訊
delete_all_cookies()   # 刪除所有 cookie 資訊