【问题标题】:Webdriver(Selenium2) - How to make selenium operate elements without wating for connecting to external AD links?Webdriver(Selenium 2) - 如何让 selenium 操作元素而不等待连接到外部 AD 链接?
【发布时间】:2014-04-08 17:59:16
【问题描述】:

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

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

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

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

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

【问题讨论】:

  • 您可以使用 Adblock 等 Chrome 扩展程序来屏蔽所有广告。使用ChromeOptions在驱动程序上设置它
  • 感谢@Faiz,但 selenium 启动 chrome 时没有扩展名,如果我在测试脚本中设置 chrome 配置文件会很复杂。

标签: selenium selenium-webdriver phpunit


【解决方案1】:

我建议您可以使用代理。 Browsermob 与 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);

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

差不多就是这样。默认loading strategy 是“NORMAL”,这意味着:

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

【讨论】:

  • 谢谢!@Erki M 我会做一些实验,稍后报告结果。
  • 对不起,我没有发布我的环境,我使用的是 phpunit/phpunit-selenium,而 Browsermob 是用于 Java 的。但我认为你指出了解决这个问题的正确方法。我现在正在尝试为 PHP 找到类似的东西。并感谢您对加载策略的解释:)
  • 我相信这个 PHPBrowserMobProxy 会解决我的问题。@Erki M 非常感谢你。
  • 在尝试了PHPBrowserMobProxy片刻之后,我发现它缺少一个名为Request的组件,我找不到下载链接。我觉得这有点复杂,然后转向另一种方式。我尝试了几个防火墙或代理软件来阻止,最终选择CCproxy作为解决方案。它确实有效。 @Erkis 你的回答对我来说仍然非常有针对性,对 Java 用户很有用
【解决方案2】:

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

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-12-04
    • 2023-03-30
    • 2012-03-26
    • 2016-06-14
    • 1970-01-01
    • 1970-01-01
    • 2016-12-25
    相关资源
    最近更新 更多