2012-01-05 18 views
11

HtmlUnit ha producido una excepción y Crash mi prueba cuando estoy cargando la página¿Es posible ignorar excepciones JavaScript cuando se trabaja con WebDriver (HtmlUnit, encuadernaciones Rubí)

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)

Sin excepción si me usa un controlador de Firefox

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

o deshabilitar JavaScript para conductor HtmlUnit

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

Soy incapaz de cambiar el código de la página de prueba y solucionar el problema, por lo que necesito o bien ignorarlo o en cualquier forma de usar Firefox JavaScript Engine en lugar del motor de JavaScript HtmlUnit estándar.

¿Es posible resolver mi problema sin cambiar el código de la página de prueba?

Actualización: Probado Carpincho + WebKit como una alternativa a Selenio + HtmlUnit - funciona bien, sin errores. Pero aún me gustaría resolver el problema sin cambiar el marco.

+0

Hola soy tener el mismo problema. Ayuda ([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

solución basada en la configuración del campo final http: // stackoverflow.com/questions/8745061/is-it-possible-to-ignore-javascript-exceptions-when-working-with-webdriver-html/35037593 # 35037593 – user3093030

Respuesta

8

Después de mirar source of the HtmlUnitDriver, parece que no hay posibilidad de personalizar el comportamiento que desea cambiar. Lo más fácil que puede hacer para resolver esto es parchear y recompilar el servidor de Selenium (que podría o no ser una opción). Necesitaría agregar esta línea:

--- 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

Alternativamente, podría subclase HtmlUnitDriver y reemplazar newWebClient(), que está protegido. –

0

Encontré el mismo problema en el mundo .net.

llegué a su alrededor en C# mediante el uso de la reflexión y un método de extensión:

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

Para Java Sólo: En la última versión del WebClient (que está envuelta por HTMLUnitDriver) client.setThrowExceptionOnScriptError(false) método es obsoleto. En caso de HTMLUnitDriver subclases, es necesario reemplazar el método 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

¿Qué es WebClient? –

1

que era capaz de resolverlo usando HPUnit_Extensions_Selenium2TestCasev1.4.0 de la siguiente manera:

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

Este método Wil encerrado cualquier registrador para siempre!

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

Sobre la base de la respuesta de @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); 
     } 
    } 
Cuestiones relacionadas