2014-07-06 25 views
1

寫使用硒webdriver的Python中一個簡單的測試功能:爲什麼selenium webdriver在每次函數調用時都訪問網絡?

from selenium import webdriver 

def test_webdriver(): 
    web = webdriver.PhantomJS() 
    web.get('http://example.com') 
    web.find_element_by_tag_name('html') 
    web.find_element_by_tag_name('head') 
    web.find_element_by_tag_name('meta') 
    web.find_element_by_tag_name('body') 
    web.find_element_by_tag_name('title') 
    web.find_element_by_tag_name('p') 
    web.find_element_by_tag_name('div') 

這個功能了時間比預期來運行,所以我CPROFILE異形它,看到一些線路是這樣的:

ncalls tottime percall cumtime percall filename:lineno(function) 
     ... 
     9 0.000 0.000 0.157 0.017 .../python2.7/urllib2.py:386(open) 
     ... 

這清楚地表明webdriver正在訪問網絡find調用我的測試功能。

我以爲webdriver只需一次抓取一次DOM,然後在get()之後抓取一次,然後在本地搜索和操作它,類似於BeautifulSoup。顯然它不是這樣工作,所以我留下了一些問題:

  • 這是webdriver的正常,預期的行爲,或者只是我的一部分配置錯誤?
  • 如果這正常行爲,那麼有沒有辦法強制webdriver到而不是訪問網絡上的每個函數調用?
  • 什麼是訪問網絡?它不能刷新每個find的頁面,只是沒有任何意義。

注:據我所知,在測試頁上的JavaScript可能會斷火意想不到的網絡電話,這就是爲什麼我使用http://example.com作爲我的測試頁面,以消除這種可能性。

回答

5

相信的webdriver和瀏覽器之間的通信發生在通過網絡連接:https://code.google.com/p/selenium/wiki/JsonWireProtocol

因此,儘管它肯定不會讓9個請求example.com,它仍然可以讓9所當地網絡請求的webdriver - 中你的例子,這是一個供應瀏覽器,一個要求瀏覽器執行GET以及頁面DOM內的七個查找。

應該有一些方法讓WebDriver客戶端庫記錄它對瀏覽器的實際調用。

+0

在服務器控制檯上,它會記錄它獲取的每個請求以及它發回的每個響應 - 所以它就像查看服務器控制檯輸出一樣簡單,以查看你是否正確(我相信你是,所以+1) – Arran

1

WebDriver是相當低級的。您不希望在那裏實現一般的DOM緩存,因爲DOM不斷變化。相反,在WebDriver之上構建一個框架,它允許您指定緩存何時適合。一個示例是Selenium-Java項目的Page Factory模式使用的@CacheLookup註釋。

-1

您會看到每個WebDriver調用的網絡活動,因爲這是WebDriver客戶端與瀏覽器進行通信的方式。

相關問題