Python 为什么selenium webdriver在每次函数调用时都访问网络?
使用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
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)