在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。显然它没有那样工作,所以我留下了一些问题:
注意:我了解测试页上的javascript可能会触发非预期的网络电话,这就是我使用http://example.com作为我的测试页面的原因,以消除这种可能性。
答案 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客户端与浏览器通信的方式。