Webdriver(Selenium 2) - 如何使selenium操作元素而无需等待连接到外部AD链接?

时间:2014-03-06 08:17:20

标签: selenium selenium-webdriver phpunit

环境:
- Selenium 2.39独立服务器
- PHP 5.4.11
- PHPUnit 3.7.28
- Chrome V31& ChromeDriver v2.7

我正在测试一个网站,该网站会调用很多广告系统,例如Google AD 浏览器需要花费大量时间连接到外部AD链接,甚至已经加载了页面的所有元素。

如果我在网页上运行测试时网络速度不快, 由于AD链路响应缓慢,Selenium会等待很长时间。
在这种情况下,Selenium通常等待超过60秒,并抛出超时异常。

我不确定Senelium是如何工作的,但似乎Selenium必须等待网页完全加载的标志,然后拉出DOM来查找元素。

我想让selenium操作元素而不必等待连接到外部AD链接 有没有办法做到这一点 ?非常感谢你。

2 个答案:

答案 0 :(得分:2)

我建议您可以使用代理。 Browsermob与硒很好地结合,非常容易使用它:

// start the proxy
ProxyServer server = new ProxyServer(4444);
server.start();

// get the Selenium proxy object
Proxy proxy = server.seleniumProxy();

// This line will automatically return http.200 for any request going to google analytics
server.blacklistRequests("https?://.*\\.google-analytics\\.com/.*", 200);

// configure it as a desired capability
DesiredCapabilities capabilities = new DesiredCapabilities();
capabilities.setCapability(CapabilityType.PROXY, proxy);

// start the browser up
WebDriver driver = new FirefoxDriver(capabilities);

  

我不确定Senelium是如何工作的,但似乎Selenium必须这样做   等待网页完全加载的迹象,然后拉出DOM找到   元件。

非常像这样。默认loading strategy为“NORMAL”,表示:

  

DOMString类型的NORMAL       远程端必须等到当前处理命令的帧的“document.readyState”等于“完成”,否则没有   除XMLHttpRequests之外的更优秀的网络请求。

答案 1 :(得分:0)

我终于为我的病情找到了一个简单的解决方案。

我决定阻止这些广告请求,并尝试了一些防火墙和代理软件,例如, comodo,privatefirewall等 comodo太沉重和复杂,privatefirewall不支持通配符,防火墙会中断测试。
最后我选择了代理软件CCproxy。试用版就足够了。 我为localhost创建了一个规则,使它只能请求我的测试网站域,并拒绝所有其他请求。

运行测试的成本大约需要1-2分钟,现在只需30秒,如果没有连接到无用的广告链接,它显然会更加稳定和快速。

以下是配置步骤:
1.使用Administor权限启动CCproxy(您应该在文件属性中使用Adminisrator进行设置)
2.单击选项,选择AutoStartup,选择AutoDetected for Local IP Address。单击“确定” 3.创建一个txt文件,输入您的域名,例如“* .rong360.com *; * .rong360。*;”
4.点击帐户,选择PermitOnly for Permit Category;
  单击“新建”,输入127.0.0.1作为IP地址/范围;
  选择WebFilter,单击右侧的E按钮创建过滤器;
  单击...按钮,选择您在步骤3中创建的文本文件,
  选择PermittedSites。单击确定
  单击“确定” 5.单击确定返回CCproxy的主UI 6.启动IE并使用127.0.0.1:808配置本地代理   其他浏览器也会自动使用此配置。

现在你可以再次运行测试,如果条件相同你会感觉更好:)