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

时间:2014-07-06 20:08:20

标签: 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')
    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,然后只用find抓取一次,然后在本地搜索和操作它,类似于BeautifulSoup。显然它没有那样工作,所以我留下了一些问题:

  • 这是webdriver的正常预期行为,还是我的错误配置?
  • 如果此正常行为,那么有没有办法强制webdriver在每次函数调用时访问网络?
  • 什么是访问网络?它无法在每个{{1}}上刷新页面,这是没有任何意义的。

注意:我了解测试页上的javascript可能会触发非预期的网络电话,这就是我使用http://example.com作为我的测试页面的原因,以消除这种可能性。

3 个答案:

答案 0 :(得分:5)

我相信WebDriver和浏览器之间的通信是通过网络连接进行的:https://code.google.com/p/selenium/wiki/JsonWireProtocol

因此虽然它当然没有向example.com发出九个请求,但它仍然可以向WebDriver发出九个本地网络请求 - 在您的示例中,这是一个配置浏览器,一个要求浏览器执行GET,以及页面DOM中的七次查找。

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

答案 1 :(得分:1)

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

答案 2 :(得分:-1)

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