1. 程式人生 > >自動化測試工具:Selenium 無頭瀏覽器:PhantomJS

自動化測試工具:Selenium 無頭瀏覽器:PhantomJS

Ajax只是一個載入技術

selenium是可以通過pycharm自動匯入模組的

然後把檔案複製到scripts目錄下,在把下載的路徑設定成環境變數就可以使用了

面試的時候直接說自己會自動化測試工具、無頭瀏覽器去爬取動態載入頁面、js分頁技術、ajax記載技術。Great

下面介紹用法(可能不全,可自行百度)以及附上程式碼:

當你出現ResourceWarning:unclosed<socket.socketfd=632,family=AddressFamily.AF_INETtype=SocketKind.SOCK_STREAM, proto=0, laddr=('127.0.0.1', 54123), raddr=('127.0.0.1', 53477)>return self._request(command_info[0], url, body=data)

這種報錯的時候沒事,只是使用版本不同,程式還是照樣執行

# #匯入webdeiver APT,可以呼叫瀏覽器和操作頁面
# from selenium import webdriver
# #匯入keys,可以使用操作鍵盤、標籤、滑鼠
# from selenium.webdriver.common.keys import Keys
# #呼叫瀏覽器    selenium是不帶瀏覽器的
# driver=webdriver.PhantomJS()
#
# driver.get('http://www.baidu.com/')
# #頁面截圖
# driver.save_screenshot('baidu.png')
#
# driver.find_element_by_id('kw').send_keys(u'美女')
#
# driver.save_screenshot('baidu.png')
#
# #獲取百度原始碼:dirver.page_source
# #獲取cookie值:dirver.get_cookies()
# #driver.find_element_by_id('kw').send_keys(Keys.RETURN)

鬥魚為例,這裡用到了測試模組,成功執行的話會返回一個OK,鬥魚是js分頁技術:

#無頭瀏覽器去爬取動態載入頁面
#呼叫測試化模組,引數值是固定的
import unittest
#匯入webdeiver APT,可以呼叫瀏覽器和操作頁面
from selenium import webdriver
#用BeautifulSoup解析模組
from bs4 import BeautifulSoup as bs

class douyu(unittest.TestCase):
    # 初始化方法,必須是setUp()
    def setUp(self):
        # 呼叫瀏覽器    selenium是不帶瀏覽器的
        self.driver = webdriver.PhantomJS()
        self.num = 0
        self.count = 0

    # 測試方法必須有test字樣開頭
    def testDouyu(self):
        self.driver.get("https://www.douyu.com/directory/all")

        while True:
            soup = bs(self.driver.page_source, "lxml")
            # 房間名, 返回列表
            names = soup.find_all("h3", {"class" : "ellipsis"})

            # 觀眾人數, 返回列表
            numbers = soup.find_all("span", {"class" :"dy-num fr"})

            #主播ID,返回列表
            ids=soup.find_all('span',{'class':'dy-name ellipsis fl'})
            # zip(names, numbers) 將name和number這兩個列表合併為一個元組 : [(1, 2), (3, 4)...]
            for name, number,id in zip(names, numbers,ids):
                print(u"主播: -" + id.get_text().strip()+u"-\t觀眾人數: -" + number.get_text().strip() + u"-\t房間名: " + name.get_text().strip())
                x=number.get_text().strip()
                y=x.replace('萬','').strip()
                self.num += 1
                self.count += int(float(y))*10000

                # 如果在頁面原始碼裡找到"下一頁"為隱藏的標籤,就退出迴圈
            if self.driver.page_source.find("shark-pager-disable-next") != -1:
                    break

                # 一直點選下一頁
            self.driver.find_element_by_class_name("shark-pager-next").click()

    # 測試結束執行的方法
    def tearDown(self):
        # 退出PhantomJS()瀏覽器
        print ("當前網站直播人數" + str(self.num))
        print ("當前網站觀眾人數" + str(self.count))
        self.driver.quit()

if __name__ == "__main__":
    # 啟動測試模組
    unittest.main()

爬取結果如下:

豆瓣的ajax載入技術:

from selenium import webdriver
import time

driver = webdriver.PhantomJS()
driver.get("https://movie.douban.com/typerank?type_name=劇情&type=11&interval_id=100:90&action=")

time.sleep(3)
# 向下滾動10000畫素
js = "document.body.scrollTop=10000"
#js="var q=document.documentElement.scrollTop=10000"

#檢視頁面快照
driver.save_screenshot("douban.png")

# 執行JS語句
driver.execute_script(js)
time.sleep(10)

#檢視頁面快照
driver.save_screenshot("newdouban.png")

driver.quit()