Selenium 自動化測試工具的使用

安裝配置

我們要對Web進行模擬自動化測試的時候,可以使用Selenium或者是Puppeteer工具。其中Puppeteer通過控制無頭Chrome來完成瀏覽器的工作。這兩個工具之間的區別在於:Selenium更加關注程序的執行流程本身,比如找到指定的元素,設置相應的值,然後點擊操作。而Puppeteer是瀏覽器的視角,比如光標移動到某個元素上,鍵盤輸入某個內容等。

使用selenium庫模擬瀏覽器,這裏我使用的是Chrome瀏覽器,需要事先安裝好selenium模塊,然後下載ChromeDriver,它的作用是啓動Chrome瀏覽器來進行模擬,ChromeDriver的下載地址是:

https://sites.google.com/a/chromium.org/chromedriver/downloads

根據自己的瀏覽器版本下載對應的版本的驅動,不對的驅動的話會啓動不了Chrome,將下載好的驅動放到指定的文件夾裏面,後面會用到。

通過selenium啓動Chrome的代碼爲:

# 配置selenium
from selenium import webdriver
driver = webdriver.Chrome()
driver.get(request_url)

注: 環境Ubuntu18.04LTS

實例 :抓取豆瓣的劉亦菲的海報圖片的爬蟲程序,調用之前定義好的下載圖片的函數,完整代碼如下(不需要登錄的情況下就可抓取):

# coding:utf-8
# 下載劉亦菲的電影封面海報
import requests
import json
from lxml import etree

# 配置selenium
from selenium import webdriver
# options = webdriver.ChromeOptions()
# options.add_argument("--incognito")  # 隱身模式打開
# driver_path = "/home/toohoo/Desktop/chromedriver_linux64/chromedriver"  # chromedriver的路徑
driver = webdriver.Chrome("/home/toohoo/Desktop/chromedriver_linux64/chromedriver")

query = "劉亦菲"
'''下載圖片'''
def download(src,id):
    # 將圖片寫到當前目錄,原來的圖片的格式是webp的,需要轉換一下格式
    dir = './' + str(id) + '.jpg'
    try:
        pic = requests.get(src, timeout=10)
        fp = open(dir,'wb')
        fp.write(pic.content)
        fp.close()
    except requests.exceptions.ConnectionError:
        print('圖片無法下載!')

'''for 循環 請求全部的url'''
request_url = 'https://www.douban.com/search?cat=1002&q=' + query
driver.get(request_url)

# 注意是這樣寫的!
html = etree.HTML(driver.page_source)

srcs = html.xpath("//div/a[@class='nbg']/img/@src ")
titles = html.xpath("//div[@class='title']/h3/a/text()")

for src,title in zip(srcs, titles):
    # 調用的時候記得轉換編碼!!
    download(src, title.encode("utf-8"))

這裏說一下遇到的問題:

  • 1、我的環境是Ubuntu18.04的,啓動的時候發現啓動不了Chrome瀏覽器,後來發現驅動是可以直接運行的,在Linux下使用./chromedriver直接就可以運行了,在win下也是可以運行的.exe文件。然後在另一個窗口接着運行python wzxPostSpider.py就行。
  • 2、海報圖片文件的編碼問題,默認使用中文命名,如果不經過轉碼的話會出現編碼錯誤,這裏需要帶調用下載函數的時候進行轉碼,轉成utf-8的形式:
for src,title in zip(srcs, titles):
    # 調用的時候記得轉換編碼!!
    download(src, title.encode("utf-8"))

內容提取理論小結

我們可以使用Selenium工具自動化模擬瀏覽器,重點是實現對元素的定位。可以使用Selenium WebDriver來歲頁面HTML進行獲取和解析,然後通過HTML中的XPath進行提取,讀取響應的內容。

那麼如何使用Webdriver自帶的元素定位功能,模擬瀏覽器的行爲呢。首先需要知道其的基本的定位和操作知識:

如果想要定位一個元素,可以通過id,name,class,tag 鏈接上的全部文本,連接上的部分文本、XPath或者CSS進行定位,在Selenium的WebDriver中爲我們提供的一些方法如下(8種):

1、通過id定位:可以使用find_element_by_id()函數。比如想要定位id=loginName的元素,就可以使用browser.find_element_by_id(“loginName”).
2、通過name定位:可以使用find_element_by_name()函數,比如我們想要對name=key_word的元素進行定位,就可以使用browser.find_elemrnt_by_name(“key_word”)。
3、通過class定位:可以使用find_element_by_class_name()函數。
4、通過tag定位:使用find_element_by_tag_name()函。
5、通過link上的完整文本定位:使用find_element_by_link_text()函數。
6、通過link上的部分文本定位:使用find_element_by_partial_link_text()函數。有時候超鏈接的文本很長,就可以通過查找部分的文本內容進行定位。
7、通過XPath進行定位:使用find_element_by_xpath()函數。使用XPath定位的通用性比較好,因爲id,name,class爲多個的時候,或者元素沒有這些屬性值的時候,Xpath就可以幫助我們完成任務。
8、通過CSS定位:使用find_element_by_css_selector()函數。CSS定位也是常用的定位方法,相比於XPath來說簡潔。

在獲取到某個元素之後,就可以對這個元素記性操作了。對元素的操作如下:

1、清空輸入框的內容:使用clear()函數;
2、在輸入框中輸入內容:使用send_keys(content)函數傳入要輸入的文本;
3、點擊按鈕:使用click()函數,如果元素是個按鈕或者鏈接的時候,可以點擊操作;
4、提交表單:使用submit()函數,元素對象爲一個表單的時候,可以提交表單;

模擬登錄豆瓣寫影評,未完~

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章