使用WebDriver时是否可以忽略JavaScript异常(HtmlUnit,Ruby绑定)

box*_*oxx 11 javascript ruby selenium webdriver htmlunit

当我加载页面时,HtmlUnit抛出异常并导致我的测试崩溃

caps = Selenium::WebDriver::Remote::Capabilities.htmlunit(:javascript_enabled => true)
driver = Selenium::WebDriver.for(:remote, :desired_capabilities => caps)
driver.navigate.?? url
Run Code Online (Sandbox Code Playgroud)

ReferenceError:未定义"x".(net.sourceforge.htmlunit.corejs.javascript.EcmaError)

如果我使用Firefox驱动程序,则不会抛出异常.

caps = Selenium::WebDriver::Remote::Capabilities.firefox
Run Code Online (Sandbox Code Playgroud)

或者为HtmlUnit驱动程序禁用JavaScript

caps = Selenium::WebDriver::Remote::Capabilities.htmlunit(:javascript_enabled => false)
Run Code Online (Sandbox Code Playgroud)

我无法更改测试页面上的代码并解决问题,因此我需要忽略它或以任何方式使用Firefox JavaScript Engine而不是标准的HtmlUnit JavaScript引擎.

是否可以在不更改测试页代码的情况下解决我的问题?

更新: 尝试Capybara + WebKit作为Selenium + HtmlUnit的替代品 - 工作正常,没有错误.但我还是想在不改变框架的情况下解决问题.

小智 18

对于Java只有: 在最新的版本WebClient(这是由包装HTMLUnitDriver)client.setThrowExceptionOnScriptError(false)方法已经过时了.在子类化HTMLUnitDriver的情况下,您需要覆盖modifyWebClient方法:

public class MyHtmlUnitDriver extends HtmlUnitDriver {

...

 @Override
    protected WebClient modifyWebClient(WebClient client) {
        //currently does nothing, but may be changed in future versions
        WebClient modifiedClient = super.modifyWebClient(client);

        modifiedClient.getOptions().setThrowExceptionOnScriptError(false);
        return modifiedClient;
    }
}
Run Code Online (Sandbox Code Playgroud)


Nik*_* B. 8

在查看源代码后HtmlUnitDriver,似乎无法自定义您想要更改的行为.您可以做的最简单的事情是修补和重新编译Selenium服务器(可能是也可能不是选项).你需要添加这一行:

--- HtmlUnitDriver.java 2012-01-05 17:45:22.779579136 +0100
+++ HtmlUnitDriver.java 2012-01-05 18:14:51.415106195 +0100
@@ -255,6 +255,7 @@
     WebClient client = newWebClient(version);
     client.setHomePage(WebClient.URL_ABOUT_BLANK.toString());
     client.setThrowExceptionOnFailingStatusCode(false);
+    client.setThrowExceptionOnScriptError(false);
     client.setPrintContentOnFailingStatusCode(false);
     client.setJavaScriptEnabled(enableJavascript);
     client.setRedirectEnabled(true);
Run Code Online (Sandbox Code Playgroud)

  • 或者,您可以继承HtmlUnitDriver并覆盖受保护的newWebClient(). (4认同)