Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/selenium/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Webdriver(Selenium2)-如何让selenium在不等待连接到外部广告链接的情况下操作元素?_Selenium_Selenium Webdriver_Phpunit - Fatal编程技术网

Webdriver(Selenium2)-如何让selenium在不等待连接到外部广告链接的情况下操作元素?

Webdriver(Selenium2)-如何让selenium在不等待连接到外部广告链接的情况下操作元素?,selenium,selenium-webdriver,phpunit,Selenium,Selenium Webdriver,Phpunit,环境: -Selenium 2.39独立服务器 -PHP 5.4.11 -PHPUnit 3.7.28 -Chrome V31和ChromeDriver v2.7 我正在测试一个网站,它调用了很多广告系统,比如谷歌广告。 浏览器需要花费大量时间连接到外部广告链接,甚至页面的所有元素都已加载 如果当我在网页上运行测试时,我的internet网络速度不快, Selenium将等待很长时间,因为广告链接响应缓慢。 在这种情况下,Selenium通常等待超过60秒,并抛出超时异常 我不确定Seneliu

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

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

如果当我在网页上运行测试时,我的internet网络速度不快, Selenium将等待很长时间,因为广告链接响应缓慢。
在这种情况下,Selenium通常等待超过60秒,并抛出超时异常

我不确定Senelium是如何工作的,但Selenium似乎必须等待网页已满负载的迹象,然后拉动DOM来查找元素

我想让selenium在不等待连接到外部广告链接的情况下运行元素。

有办法吗?非常感谢。

我建议您可以使用代理。与selenium集成良好,使用非常方便:

// 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);

我不确定硒是如何起作用的,但似乎硒必须起作用 等待网页已满负载的迹象,然后拉动DOM查找 元素

很像这样。默认值为“正常”,即:

DOMString类型的NORMAL 远程端必须等待当前正在处理命令的帧的“document.readyState”等于“complete”,否则没有 除了XMLHttpRequests之外,还有更多未完成的网络请求


我终于找到了一个简单的解决办法

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

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

以下是配置步骤:
1.使用Administor权限启动CCproxy(应使用文件属性中的Administor进行设置)
2.单击选项,选择自动启动,为本地IP地址选择自动检测。单击“确定”。
3.创建一个txt文件,输入您的域,如“*.rong360.com*;*.rong360.*”
4.点击〖科目〗按钮,选择“许可证类别”
单击〖新建〗按钮,输入IP地址/范围127.0.0.1
选择WebFilter,点击右侧的E按钮创建一个过滤器
单击。。。按钮,选择在步骤3创建的文本文件,
选择许可站点。单击“确定”
单击“确定”。
5.单击“确定”返回CCproxy的主界面。
6.启动IE并使用127.0.0.1:808配置本地代理
其他浏览器也会自动使用此配置


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

谢谢@Erki M我将做一些实验,稍后报告结果。很抱歉,我没有发布我的环境,我使用的是phpunit/phpunit selenium,而Browsermob是用于Java的。但我认为你指出了解决这个问题的正确方法。我现在正试图为PHP找到类似的东西。感谢您对加载策略的解释:)我相信这个PHPBrowserMobProxy会解决我的问题。@Erki M非常感谢您。在尝试了一会儿PHPBrowserMobProxy之后,我发现它缺少一个名为Request的组件,我找不到该组件的下载链接。我觉得有点复杂,然后转向另一种方式。我尝试了几种防火墙或代理软件来阻止,最后选择了作为解决方案。它确实有效@Erkis您的答案对我来说仍然是非常有方向性的,对Java用户非常有用。您可以使用chrome扩展(如Adblock)来阻止所有广告。使用Thank@Faiz在驱动程序上设置它,但selenium启动chrome时没有扩展,如果我在测试脚本中设置chrome配置文件,则会很复杂。