selenium webDriver的運用

聲明實例運行瀏覽器

配置瀏覽器驅動後,可以通過簡單的2行代碼就可以驅動瀏覽器(配置這裡不加贅述)

from selenium import webdriver
driver = webdriver.Chrome()
driver.get("//www.baidu.com")

1.簡單操作

1.1瀏覽器操作

 

 

 

driver.back()#後退
driver.forward()#前進
driver.refresh()#刷新
1.2瀏覽器窗口操作

 

 

 

driver.maximize_window()#瀏覽器最大化窗口
driver.minimize_window()#瀏覽器最小化窗口
driver.close()#關閉瀏覽器
driver.set_window_position(坐標X,坐標Y) #移動瀏覽器到坐標位置
driver.set_window_size(寬度像素,高度像素)#講瀏覽器窗口設置指定大小
driver.set_window_rect(坐標X,坐標Y,寬度像素,高度像素)#將瀏覽器窗口移動到指定位置,同時設置窗口大小
1.3獲取瀏覽器信息
print(driver.title) #百度一下,你就知道
print(driver.current_url) #//www.baidu.com/
#獲取位置對象
driver.get_window_position()
#獲取大小對象
driver.get_window_size()
#獲取位置和大小對象
driver.get_window_rect()

2查找頁面元素

#基本查找元素
from selenium.webdriver.common.by import By

driver.find_element(By.ID,"kw").send_keys("")
driver.find_element(By.NAME,"wd").send_keys("")
driver.find_element(By.LINK_TEXT,"新聞").click()
xpath表達式
/子節點
//任意位置
*任意元素
.當前節點 ..父級極點
子節點穩定//*[@屬性=「屬性值」]/.. 這樣就可以向上找到節點在往上繼續/.. 然後往下找div[索引]
following-sibling::同節點最近的下一個(小哥)
preceding-sibling::同節點最近的上一個(大哥)
@代表屬性
格式
屬性://*[@屬性=「屬性值」]
文本://*[text()=’文本值’]
模糊查詢 [ contains(@屬性/text(),「值」)]
starts_with(@屬性/text(),「值」):以xxx開始 :屬性,文本值
多條件查詢and:
//*[@屬性=『值』 and@屬性=『值』 ]
svg元素
//*[name()=’svg’]

3元素基本操作

click

通常用於單擊按鈕(<button/>、<input type=”reset”/>、<input type=”submit”>)、鏈接(<a/>)、單選框(<input type=”radio”/>)、複選框(<input type=”checkbox”/>)等元素,但實際上對於頁面上任何可見的元素,都可用click函數單擊

send_keys

該函數一般用於輸入框元素(<input type=”text”/><input type=”password”/><textarea/>)或文件上傳元素(<input type=”file”/>),但理論上可以對任何可輸入元素進行操作。

clear

和send_keys函數類似,clear函數多用於輸入框元素。例如在百度搜索頁面,我們可以先在百度搜索文本框中填入關鍵字,然後搜索。如果之後要再搜索其他關鍵字,就需要執行clear函數,先清空文本再輸入關鍵字

下拉框

下拉框分為單選下拉框(<Select/>)和多選列表框(<Select multiple= “multiple”/>)

from selenium.webdriver.support.select import Select
sel=Select(driver.find_element(By.NAME,"cat_id"))
sel.select_by_value("頁面元素value數字")
sel.select_by_index("使用下標")
sel.select_by_visible_text("根據文本選擇")
sel.deselect_all()#取消所有選
獲取元素的基本屬性
from selenium.webdriver.common.by import By
baiduNewsLink = driver.find_element(By.XPATH,"//*[text()='新聞']")
print(baiduNewsLink.text)#文本值
print(baiduNewsLink.tag_name)#標籤類型
print(baiduNewsLink.is_selected())#元素是否選中
print(baiduNewsLink.is_enabled())#元素是否可以編輯
print(baiduNewsLink.is_displayed())#元素是否已經顯示
處理瀏覽器彈框

彈窗一共有三類:alert(只有確定),confirm(有確定又取消),prompt(有確定有取消還可以輸入值) alert不是一個方法是一個屬性

ale=driver.switch_to.alert 
ale.accept()#點擊確定 
ale.dismiss()#點擊取消
多網頁切換
print(driver.current_window_handle)#打印當前正在操作的瀏覽器句柄
print(driver.window_handles)#打印實例下的所有句柄
driver.switch_to.window(driver.window_handles[0])#切換到第一個窗口句柄

4等待機制

通過函數設置等待的超時時間

driver.set_page_load_timeout(最長等待秒數)

改函數是全局設置,在整個實例周期都會生效

強制等待

強制等待很簡單,直接使用PYthon的time函數即可

如下表示3秒延遲

import time
time.sleep(3)

缺點:處理起來毫無彈性

元素級等待機制——隱式等待

這是Selenium最初版本就支持的等待方式。它的作用是在執行find_element…這類函數時增加一個寬限時間,它決定了查找元素時的最長等待時間

driver.implicitly_wait(等待秒數)

缺點:

  1. 全局使用
  2. 如果某個元素未定位到會完整的等待設置的最長時間,減緩了執行速度
  3. 很多頁面有較多的異步刷新和操作,很多元素是動態的,都需要等待,用隱式也不太好
元素級等待機制——顯式等待

元素級等待機制的最佳實踐方式是顯式等待,它是一種相當完美的等待機制。只需要指定條件判斷函數,Selenium會每隔一定時間檢測該條件是否成立。如果成立,就立刻執行下一步;否則,一直等待,直到超過最大等待時間,拋出超時異常

WebDriverWait(實例,超時秒數,檢測時間間隔默認0.5秒)
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.common.by import By
#這種場景下更適合使用Lambda表達式定義匿名函數
# WebDriverWait(driver,10).until(條件判斷函數:等待到條件判斷函數返回True)
# WebDriverWait(driver,10).until_not(條件判斷函數:等待到條件判斷函數返回False)
WebDriverWait(driver,10).until(lambda p: p.find_element(By.XPATH,"//*[text()='新聞']").is_displayed)

5.ActionChains——操作鏈

from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains
from selenium.webdriver.common.by import By
driver = webdriver.Chrome()
driver.get("//www.baidu.com")
ActionChains(driver).click(driver.find_element(By.XPATH,"//*[text()='新聞']")).perform()
  1. 使用操作鏈需要先導入ActionChains對象
  2. ActionChains傳入webdriver實例
  3. 接着預約了單擊操作,看清楚這裡並沒有執行單擊操作,這是對操作進行設置
  4. perform:執行操作鏈中所有的操作,即之前預約的所有操作
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.action_chains import ActionChains

driver = webdriver.Chrome()
driver.get("//www.baidu.com")

# move_to_element會將鼠標指針放置在"設置"鏈接上,實現懸停效果
ActionChains(driver)\
    .move_to_element(
driver.find_element(By.XPATH, "//span[text()='設置']"))\
    .pause(3)\
    .perform()

ActionChains(driver)\
    .click(driver.find_element(By.LINK_TEXT, "搜索設置"))\
    .pause(3)\
    .perform()

ActionChains(driver)\
    .click(driver.find_element(By.ID, "s1_2"))\
    .click(driver.find_element(By.ID, "SL_2"))\
    .click(driver.find_element(By.ID, "sh_1"))\
    .click(driver.find_element(By.LINK_TEXT, "保存設置"))\
    .pause(3)\
    .perform()

註:

操作鏈中涉及的所有WebElement元素在操作鏈執行時必須同時存在,且處於可操作狀態,否則無法執行操作鏈。也就是說,在同一個操作鏈中,無法做到先操作某個元素,然後另一個新元素才顯示,接着再操作這個新元素。

6.對頁面窗口截圖

driver.save_screenshot(截圖文件保存路徑)

7.對元素截圖

driver.find_element(By.XPATH,"//*[text()='新聞']").screenshot(截圖保存的路徑)