2012-01-05 16 views
11

HtmlUnit के साथ काम करने की अनदेखी करने के अपवाद फेंकता है और अपने परीक्षण दुर्घटना जब मैं यह संभव JavaScript अपवाद जब WebDriver (HtmlUnit, रूबी बाइंडिंग)

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

कोई अपवाद नहीं है अगर मैं फेंक दिया जाता है पेज

caps = Selenium::WebDriver::Remote::Capabilities.htmlunit(:javascript_enabled => true) 
driver = Selenium::WebDriver.for(:remote, :desired_capabilities => caps) 
driver.navigate.то url 
लोड हो रहा है कर रहा हूँ है फ़ायरफ़ॉक्स ड्राइवर का प्रयोग करें। HtmlUnit ड्राइवर के लिए

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

या अक्षम जावास्क्रिप्ट

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

मैं परीक्षण पृष्ठ पर कोड बदल सकते हैं और इस समस्या को ठीक करने में असमर्थ हूँ, तो मैं या तो इसे अनदेखा या किसी भी तरह फ़ायरफ़ॉक्स का उपयोग करने के लिए की जरूरत है मानक HtmlUnit जावास्क्रिप्ट इंजन के बजाय जावास्क्रिप्ट इंजन।

क्या परीक्षण पृष्ठ के कोड को बदले बिना मेरी समस्या का समाधान करना संभव है?

अद्यतन: की कोशिश की Capybara + सेलेनियम + HtmlUnit के लिए एक विकल्प के रूप में वेबकिट - ठीक काम करता है, त्रुटियों के बिना। लेकिन फिर भी मैं ढांचे को बदलने के बिना समस्या को हल करना चाहता हूं।

+0

हैलो मैं एक ही समस्या है कर रहा हूँ से जवाब के आधार पर। सहायता ([http://stackoverflow.com/questions/23659340/option-setthrowexceptiononscripterrorfalse-not-work-in-htmlunit-why-java][1]) [1]: http: // stackoverflow .com/प्रश्न/23659340/विकल्प-setthrowexceptiononscripterrorfalse-not-work-in-htmlunit-why-java – Pryanik

+0

अंतिम फ़ील्ड http: // stackoverflow सेट करने के आधार पर समाधान।कॉम/प्रश्न/8745061/यह-संभव-से-अनदेखा-जावास्क्रिप्ट-अपवाद-जब-काम-के-साथ-वेब-चालक-एचटीएमएल/350375 9 3 # 35037593 – user3093030

उत्तर

8

source of the HtmlUnitDriver पर देखने के बाद, ऐसा लगता है कि उस व्यवहार को अनुकूलित करने की कोई संभावना नहीं है जिसे आप बदलना चाहते हैं। इसे हल करने के लिए आप सबसे आसान काम कर सकते हैं सेलेनियम सर्वर को पैच और पुन: संकलित करना (जो एक विकल्प हो सकता है या नहीं)। आपको यह लाइन जोड़ने की आवश्यकता होगी:

--- 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 को उपclass कर सकते हैं और संरक्षित किए गए newWebClient() को ओवरराइड कर सकते हैं। –

0

मुझे .NET दुनिया में एक ही समस्या मिली।

मैं प्रतिबिंब और एक विस्तार विधि का उपयोग कर ग # में इसके चारों ओर हो गया है:

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

जावा केवल के लिए: 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

वेब क्लाइंट क्या है? –

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

इस विधि wil हमेशा के लिए किसी भी लकड़हारा चुप रहो!

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); 
     } 
    } 
संबंधित मुद्दे