Python 为什么selenium webdriver在每次函数调用时都访问网络?

Python 为什么selenium webdriver在每次函数调用时都访问网络?,python,selenium,webdriver,phantomjs,Python,Selenium,Webdriver,Phantomjs,使用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') we

使用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使用
get()
一次性地获取DOM,然后在本地搜索和操作它,类似于BeautifulSoup。很明显,它不是那样工作的,所以我还有一些问题要问:

  • 这是webdriver的正常行为,还是我的错误配置
  • 如果这是正常行为,那么有没有办法强制webdriver在每次函数调用时都不访问网络
  • 它访问网络的目的是什么?它不可能在每次
    查找时都刷新页面,这根本没有任何意义

注意:我知道测试页面上的javascript可能会触发非预期的网络调用,这就是我将其用作测试页面的原因,以消除这种可能性。

我相信WebDriver和浏览器之间的通信是通过网络连接进行的:

因此,虽然它肯定不会向example.com发出九个请求,但它仍可能向WebDriver发出九个本地网络请求-在您的示例中,一个请求提供浏览器,一个请求浏览器执行GET,以及在页面DOM中进行七次查找


应该有办法让您的WebDriver客户端库记录它对浏览器的实际调用。

WebDriver的级别非常低。您不希望在那里实现一般的DOM缓存,因为DOM是不断变化的。相反,在WebDriver之上构建一个框架,允许您指定何时适合缓存。一个例子是Selenium Java项目模式所使用的注释。

您可以看到每个WebDriver调用的网络活动,因为这就是WebDriver客户端与浏览器通信的方式。

在服务器控制台上,它将记录它收到的每个请求以及它发送回的每个响应,因此它与查看服务器控制台一样简单输出以查看您是否正确(我相信您是正确的,所以+1)