selenium常用操作,查找元素,操作Cookie,獲取截圖,獲取窗口信息,切換,執行js代碼


目錄:

1. 常用操作

2. 查找元素

3. 操作Cookie

4. 獲取截圖

5. 獲取窗口信息

6. 切換

7. 執行JS代碼

 


 

簡介

selenium.webdriver.remote.webdriver.WebDriver 這個類其實是所有其他Webdriver的父類,

例如Chrome WebdriverFirefox Webdriver都是繼承自這個類。這個類中實現了每個Webdriver間相通的方法。

 


 

常用操作

- get(url)

  在當前瀏覽器會話中訪問傳入的url地址

driver.get("https://www.baidu.com")

 - close()  

  關閉瀏覽器當前頁面(只有當前的一個頁面會被關閉)

driver.close()

 

- quit()

  退出webdriver並關閉所有窗口(推薦,這樣退出不會浪費內存)

- refresh()

  刷新當前頁面

- title【注意沒有括號】  

  獲取當前頁面的標題(就是瀏覽器頁面上方的窗口標題)

- page_source

  獲取當前頁面渲染之后的源代碼

- current_url

  獲取當前頁面的url

- window_handles

  獲取當前會話中所有窗口的句柄(句柄就是一個頁面的標志,頁面切換的參數)


 

查找元素

Webdriver對象中內置了查找節點元素的方法,使用非常方便。

單個查找

 

以下是查找單個元素的方法:

方法 作用
find_element_by_xpath() 通過Xpath查找
find_element_by_class_name() 通過class屬性查找
find_element_by_css_selector() 通過css選擇器查找
find_element_by_id() 通過id查找
find_element_by_link_text() 通過鏈接文本查找
find_element_by_name() 通過name屬性進行查找
find_element_by_partial_link_text() 通過鏈接文本的部分匹配查找
find_element_by_tag_name() 通過標簽名查找

查找后返回的是一個Webelement對象。

查找到了對象,就相當於瀏覽器的鼠標已經放在了對象上面,想要對其操作,

就需要用一個變量存放該對象,再進行需要的操作

多個查找

 上面的方法都是將第一個找到的元素返回,而將所有匹配的元素進行返回使用的是

find_elements_by_* 方法。

注意:將其中的elelment加上一個s,就是對應的多個查找的方法。

此方法返回的是一個Webelement對象組成的列表。

 

通過私有方法進行查找

除了以上的多種查找方式,還有兩種私有方法find_element()find_elements()可以使用:

 

例子:

 

需要導入新的方法:from selenium.webdriver.common.by import By
from selenium.webdriver.common.by import By
​
driver.find_element(By.XPATH, '//button[text()="Some text"]')
driver.find_elements(By.XPATH, '//button')

 

 

By這個類是專門用來查找元素時傳入的參數,這個類中有以下屬性:

 

ID = "id"
XPATH = "xpath"
LINK_TEXT = "link text"
PARTIAL_LINK_TEXT = "partial link text"
NAME = "name"
TAG_NAME = "tag name"
CLASS_NAME = "class name"
CSS_SELECTOR = "css selector"

 

使用了WebDriverWait以后仍然無法找到元素

有很多時候,一個簡單的元素,明明也加了顯式等待,但就是找不到,代碼在仔細查看過后也沒有問題后,多半是以下這幾種情況:

  1. 由於分辨率設置的原因,查找的元素當前是不可見的。

  2. 某些頁面的元素是需要向下滾動頁面才會加載的。

  3. 由於某些其他元素的短暫遮擋,所以無法定位到。

1.分辨率原因

這時候應該設置好分辨率,使當前元素能夠顯示到頁面中。

2.需要滾動頁面

有些頁面為了性能的考慮,頁面下方不在當前屏幕中的元素是不會加載的,只有當頁面向下滾動時才會繼續加載。

而selenium本身不提供向下滾動的方法,所以我們需要去用JS去滾動頁面:

driver.execute_script("window.scrollTo(0, document.body.scrollHeight)")

網上查到的一些滾動方式在Chrome上無效。但這一句是有效的。

滾動的位置:

網頁可見區域寬: document.body.clientWidth;
網頁可見區域高: document.body.clientHeight;
網頁可見區域寬: document.body.offsetWidth   (包括邊線的寬);
網頁可見區域高: document.body.offsetHeight  (包括邊線的寬);
網頁正文全文寬: document.body.scrollWidth;
網頁正文全文高: document.body.scrollHeight;
網頁被卷去的高: document.body.scrollTop;
網頁被卷去的左: document.body.scrollLeft;
網頁正文部分上: window.screenTop;
網頁正文部分左: window.screenLeft;
屏幕分辨率的高: window.screen.height;
屏幕分辨率的寬: window.screen.width;
屏幕可用工作區高度: window.screen.availHeight;
屏幕可用工作區寬度:window.screen.availWidth;

3.由於其他元素的遮擋

有時候因為一些彈出元素的原因,如果還使用EC.presence_of_element_located()的話,

我們需要定位的元素就無法被找到,這個時候我們就應該改變我們判斷元素的方法:

element = WebDriverWait(driver, 10).until(
    EC.visibility_of_element_located((By.XPATH, '')) )

使用EC.visibility_of_element_located()方法可以在等待到當前元素可見后,才獲取元素。

在我們找不到元素,或者跟元

素無法交互時,應該多去根據當前的情況,靈活選擇顯式等待的判斷方式。


 

操作Cookie

  • add_cookie(cookie_dict)

    給當前會話添加一個cookie。

    • cookie_dict: 一個字典對象,必須要有"name"和"value"兩個鍵,

    • 可選的鍵有:“path”, “domain”, “secure”, “expiry” 。

    • 用法:

      driver.add_cookie({‘name’ : ‘foo’, ‘value’ : ‘bar’})
      driver.add_cookie({‘name’ : ‘foo’, ‘value’ : ‘bar’, ‘path’ : ‘/’})
      driver.add_cookie({‘name’ : ‘foo’, ‘value’ : ‘bar’, ‘path’ : ‘/’, ‘secure’:True})

       

  • get_cookie(name)

    按name獲取單個Cookie,沒有則返回None。

  • get_cookies()

    獲取所有Cookie,返回的是一組字典。

  • delete_all_cookies()

    刪除所有Cookies。

  • delete_cookie(name)

    按name刪除指定cookie。

 


 

獲取截屏

  • get_screenshot_as_base64()

    獲取當前窗口的截圖保存為一個base64編碼的字符串。

  • get_screenshot_as_file(filename)

    獲取當前窗口的截圖保存為一個png格式的圖片,filename參數為圖片的保存地址,最后應該以.png結尾。如果出現IO錯誤,則返回False。

    用法:

    driver.get_screenshot_as_file(‘/Screenshots/foo.png’)
  • get_screenshot_as_png()

    獲取當前窗口的截圖保存為一個png格式的二進制字符串。

 


 

 

獲取窗口信息

  • get_window_position(windowHandle='current')

    獲取當前窗口的x,y坐標。(字典格式)

  • get_window_size(windowHandle='current')

     獲取當前窗口的高度和寬度。(字典格式)

  • get_window_rect()

    獲取當前窗口的高度和寬度和當前窗口的x,y坐標。(字典格式)

切換

在實際的爬蟲中,有時候我們會遇到找不到元素的問題,明明定位的路徑沒問題,

這個時候我們可以考慮一下是否是該頁面存在frame的問題導致的定位不到元素。

  • switch_to_frame(frame_reference)

    將焦點切換到指定的子框架中


 

用selenium操作瀏覽器如果需要在打開新的頁面,這個時候會有問題,

因為我們用selenium操作的是第一個打開的窗口,所以新打開的頁面我們是無法去操作的,

所以我們要用到切換窗口:既handle切換的方法

 

  • switch_to.window(window_name)

    切換窗口(參數就是句柄)

 


 

有的時候還會遇到彈窗的問題, 主要有兩種一種是瀏覽器彈窗(alert/prompt),

一種是自定義彈窗

自定義彈窗,就是一個自定義的div層,是隱藏頁面中的,當觸發了這個彈窗后,他就顯示出來,

這種方式我們通過正常的定位方式是可以定位到的。

alert彈窗,就要用下面的方法處理:

 

 


 

 

執行JS代碼

 

execute_async_script(script, *args)

 

在當前的window/frame中異步執行JS代碼。

 

script:是你要執行的JS代碼。

 

*args:是你的JS代碼執行要傳入的參數。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM