2012-01-05 5 views
11

HtmlUnit бросает исключение и крах мой тест, когда я загружаю страницуМожно ли игнорировать исключения JavaScript при работе с WebDriver (HtmlUnit, Рубин привязок)

caps = Selenium::WebDriver::Remote::Capabilities.htmlunit(:javascript_enabled => true) 
driver = Selenium::WebDriver.for(:remote, :desired_capabilities => caps) 
driver.navigate.то url 

ReferenceError: "x" is not defined. (net.sourceforge.htmlunit.corejs.javascript.EcmaError)

Исключение не генерируется, если я используйте драйвер Firefox.

caps = Selenium::WebDriver::Remote::Capabilities.firefox 

Или отключить JavaScript для водителя HtmlUnit

caps = Selenium::WebDriver::Remote::Capabilities.htmlunit(:javascript_enabled => false) 

Я не могу изменить код на тестовой странице и исправить эту проблему, так что мне нужно либо игнорировать его или каким-либо образом использовать Firefox JavaScript Engine вместо стандартного JavaScript-движка HtmlUnit.

Можно ли решить мою проблему без изменения кода тестовой страницы?

Update: Пробовал Капибара + WebKit как альтернатива Селен + HtmlUnit - работает отлично, без ошибок. Но все же я хотел бы решить проблему, не меняя рамки.

+0

Здравствуйте, я же проблема. Помощь ([http://stackoverflow.com/questions/23659340/option-setthrowexceptiononscripterrorfalse-not-work-in-htmlunit-why-java][1]) [1]: HTTP: // StackOverflow .com/questions/23659340/option-setthrowexceptiononscripterrorfalse-not-work-in-htmlunit-why-java – Pryanik

+0

решение, основанное на настройке конечного поля http: // stackoverflow.com/questions/8745061/is-it-possible-to-ignore-javascript-exceptions-when-working-with-webdriver-html/35037593 # 35037593 – user3093030

ответ

8

После просмотра source of the 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); 
+4

Кроме того, вы можете подклассифицировать HtmlUnitDriver и переопределить защищенный newWebClient(). –

0

Я нашел ту же проблему в мире .net.

я получил вокруг него в C# с помощью отражения и метод расширения:

public static void SetThrowOnScriptErrors(this HtmlUnitDriver driver, 
              bool throwScriptErrors) 
{ 
    object webClient = driver.GetType().InvokeMember("_webClient", 
            BindingFlags.GetField | 
            BindingFlags.NonPublic | 
            BindingFlags.Instance, null, 
            driver, new object[0]); 

    webClient.GetType().InvokeMember("throwExceptionOnScriptError_", 
             BindingFlags.SetField | 
             BindingFlags.NonPublic | 
             BindingFlags.Instance, 
             null, webClient, 
             new object[] {throwScriptErrors}); 
} 
16

Для 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; 
    } 
} 
+0

Что такое WebClient? –

1

Я был в состоянии решить его с помощью HPUnit_Extensions_Selenium2TestCasev1.4.0 следующим образом:

class TestBase extends PHPUnit_Extensions_Selenium2TestCase 
{ 
    public function setUp() 
    { 
     $this->setHost(<your-host>); 
     $this->setPort(<your-port>); 
     $this->setDesiredCapabilities(Array("javascriptEnabled"=>"false")); 
0

Этот метод Виль заткнуться любой регистратор для всегда!

static void setFinalStatic(Field field, Object newValue) throws Exception { 
     field.setAccessible(true); 

     Field modifiersField = Field.class.getDeclaredField("modifiers"); 
     modifiersField.setAccessible(true); 
     modifiersField.setInt(field, field.getModifiers() & ~Modifier.FINAL); 

     field.set(null, newValue); 
    } 


setFinalStatic(com.gargoylesoftware.htmlunit.javascript.JavaScriptEngine.class.getDeclaredField("LOG"), new org.apache.commons.logging.Log() { 

      }); 
0

На основании ответа от @Vitaly

import org.openqa.selenium.htmlunit.HtmlUnitDriver; 
    import com.gargoylesoftware.htmlunit.WebClient; 
    import java.util.logging.Logger; 
    import java.util.logging.Level; 
    public class MyHtmlUnitDriver extends HtmlUnitDriver { 
     protected void modifyWebClient() { 
      /* turn off annoying htmlunit warnings */ 
      Logger.getLogger("com.gargoylesoftware").setLevel(Level.OFF); 
      WebClient newWebClient = getWebClient(); 
      newWebClient.getOptions().setThrowExceptionOnScriptError(false); 
      newWebClient.getOptions().setThrowExceptionOnFailingStatusCode(false); 
      newWebClient.getOptions().setPrintContentOnFailingStatusCode(false); 
      modifyWebClient(newWebClient); 
     } 
    } 

 Смежные вопросы

  • Нет связанных вопросов^_^