2012-01-05 26 views
11

HtmlUnit ném ngoại lệ và sụp đổ thử nghiệm của tôi khi tôi đang tải trangCó thể bỏ qua trường hợp ngoại lệ JavaScript khi làm việc với WebDriver (HtmlUnit, Ruby bindings)

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)

Không có ngoại lệ được ném nếu tôi sử dụng trình điều khiển Firefox.

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

Hoặc vô hiệu hóa JavaScript cho tài xế HtmlUnit

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

Tôi không thể thay đổi mã trên trang kiểm tra và sửa chữa các vấn đề, vì vậy tôi cần phải hoặc là bỏ qua nó hoặc trong bất kỳ cách nào để sử dụng Firefox JavaScript Engine thay vì Công cụ JavaScript HtmlUnit chuẩn.

Có thể giải quyết sự cố của tôi mà không thay đổi mã của trang thử nghiệm không?

Cập nhật: Đã thử Capybara + WebKit thay thế cho Selenium + HtmlUnit - hoạt động tốt, không có lỗi. Nhưng tôi vẫn muốn giải quyết vấn đề mà không thay đổi khung.

+0

Xin chào Tôi có cùng một vấn đề. Trợ giúp ([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 Giải pháp – Pryanik

+0

dựa trên thiết lập trường cuối cùng http: // stackoverflow.com/questions/8745061/is-it-possible-to-ignore-javascript-exceptions-when-working-with-webdriver-html/35037593 # 35037593 – user3093030

Trả lời

8

Sau khi xem source of the HtmlUnitDriver, có vẻ như không có khả năng tùy chỉnh hành vi bạn muốn thay đổi. Điều đơn giản nhất bạn có thể làm để giải quyết vấn đề này là vá và biên dịch lại máy chủ Selenium (có thể hoặc không phải là một tùy chọn). Bạn cần phải thêm dòng này:

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

Cách khác, bạn có thể phân lớp HtmlUnitDriver và ghi đè newWebClient(), được bảo vệ. –

0

Tôi đã tìm thấy cùng một vấn đề trong thế giới .net.

tôi xung quanh nó trong C# bằng cách sử dụng phản xạ và một phương pháp khuyến nông:

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

Đối với Java Chỉ: Trong phiên bản mới nhất của WebClient (được bọc bởi HTMLUnitDriver) client.setThrowExceptionOnScriptError(false) phương pháp bị phản đối. Trong trường hợp của subclassing HTMLUnitDriver, bạn cần phải ghi đè phương pháp 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 là gì? –

1

tôi đã có thể giải quyết nó bằng cách sử HPUnit_Extensions_Selenium2TestCasev1.4.0 như sau:

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

Phương pháp này wil im lặng bất kỳ logger cho luôn!

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

Dựa trên câu trả lời từ @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); 
     } 
    } 
Các vấn đề liên quan