2012-07-18 22 views
13

Tôi đang làm việc để sống theo cách BDD. Tôi đang sử dụng Cucumber (với Selenium) và tình cờ sử dụng các phương thức khởi động Twitter trong ứng dụng của tôi.Gợi ý cho việc sử dụng Selenium để chơi tốt với chế độ Bootstrap phai?

Khi chạy thử nghiệm Cucumber, tôi gặp lỗi "Selenium::WebDriver::Error::MoveTargetOutOfBoundsError". Sau nhiều lần tìm kiếm, gỡ rối và tuyệt vọng chung, tôi đã kết luận rằng nó phải làm với việc sử dụng tham số "fade" trong các phương thức Bootstrap của tôi. Nếu tôi sử dụng "fade", lỗi được ném:

<div class="modal hide fade" id="info-share-edit-modal" style="display: none;"> 
    . 
    . 
    . 
</div> 

Nếu tôi loại bỏ "fade", sau đó Selenium là tràn đầy hạnh phúc và thử nghiệm của tôi rõ ràng:

<div class="modal hide" id="info-share-edit-modal" style="display: none;"> 
    . 
    . 
    . 
</div> 

Vì vậy, bây giờ tôi bỏ "fade" từ khác nhau của tôi modals. Nhưng, điều này làm tôi buồn vì tôi thích hiệu ứng mờ dần.

Có ai khác gặp phải sự cố khi sử dụng Selenium với phai trong các phương thức Bootstrap không? Nếu vậy, có cách nào thông minh để đưa hai người cùng làm việc với nhau không?

Nhân tiện (không chắc là nó quan trọng), tôi là Rails 3.2.3, Firefox 13.0.1 và Ubuntu 12.04LTS.

+0

Tôi đã gặp phải lỗi tương tự, bằng cách sử dụng 'reveal.js' từ Foundation Zurb và nhờ đề xuất của bạn, tôi đã làm nó bằng cách xóa hoạt ảnh' fade'. Nhưng tôi không tìm được giải pháp thực sự. Vì vậy, quan tâm để nghe cách người khác giải quyết vấn đề này. – nathanvda

+0

Khi nào xảy ra lỗi chính xác? – spinningarrow

Trả lời

-1

Đặt trong một lá cờ để trong môi trường thử nghiệm, nó không phai mờ, nhưng nó hoạt động trong mọi môi trường khác.

8

Tôi đã làm một bài kiểm tra nhanh với chèn WebDriverWait để xem xét độ mờ đục của phương thức. Dường như nó hoạt động, nhưng thời gian sẽ nói là (ít nhất là đối với tôi) đó là một vấn đề liên tục. Đây là thực hiện của tôi trong Java.

//Ensure the modal is done animating 
new WebDriverWait(driver, 5).until(
    new ExpectedCondition<Boolean>() { 
     @Override 
     public Boolean apply(WebDriver webDriver) {   
      return webDriver.findElement(By.id("videoModal")).getCssValue("opacity").equals("1"); 
     } 
    } 
); 
+0

[ticket] này (https://github.com/seleniumhq/selenium-google-code-issue-archive/issues/2766) cho trình điều khiển Chrome đề xuất bạn có quyền đó. Trong rất nhiều từ, nó nói rằng một yếu tố phải ngừng hoạt hình trước khi bạn có thể nhấp vào nó. – jpaugh

-1

Trong một trường hợp thử nghiệm selen khi ứng dụng mở ra phương thức bootstrap, thêm một lệnh dừng lại để hỏi selen để tạm dừng trong một giây trước khi tương tác với nội dung của phương thức của bạn:

Command: pause/
Target: 1000/
Value: (leave empty) 
2

Tôi giải quyết nó này cách (sử dụng C#). Nó nhanh và không thất bại một lần.

public static void WaitForModal(this RemoteWebDriver driver) 
{ 
    using (driver.NoImplicitWait()) 
    { 
     var wait = new WebDriverWait(driver, TimeSpan.FromSeconds(30)); 
     wait.Until(d => d.FindElements(By.ClassName("modal-backdrop").Count == 0); 
    } 
} 

NoImplicitWait được sử dụng để tạm thời vô hiệu hóa trình điều khiển ngầm ẩn.

public static NoImplicitWait NoImplicitWait(this IWebDriver driver) 
{ 
    return new NoImplicitWait(driver); 
} 

public sealed class NoImplicitWait : IDisposable 
{ 
    private readonly IWebDriver _driver; 

    public NoImplicitWait(IWebDriver driver) 
    { 
     _driver = driver; 
     _driver.Manage().Timeouts().ImplicitlyWait(TimeSpan.FromSeconds(0)); 
    } 

    public void Dispose() 
    { 
     _driver.Manage().Timeouts().ImplicitlyWait(TimeSpan.FromSeconds(30)); 
    } 
} 
0

C# mã

tôi đã cùng một vấn đề và mã này đang làm việc cho tôi từ 2+ tháng, không còn phải sụp đổ.

public static void WaitForModal(this IWebDriver driver) 
    { 
     wait.Until<IWebDriver>((d) => 
     { 
      if (driver.FindElements(By.ClassName("modal-backdrop")).Count == 0) 
      { 
       return driver; 
      } 
      return null; 
     }); 
    } 

Nó chờ đợi cho đến khi nó tìm thấy không IWebElement rằng có một class của "modal-bối cảnh".

0

Cải thiện câu trả lời của người dùng1965252, điều này phù hợp với tôi. Chỉ cần thay thế the-modal-id bằng id div phương thức của bạn.

new WebDriverWait(driver, TIME_OUT_IN_SECONDS).until(and(
     new ExpectedCondition<Boolean>() { 
      @Override 
      public Boolean apply(WebDriver webDriver) { 
       return webDriver.findElement(id("the-modal-id")) 
         .getCssValue("opacity").equals("0"); 
      } 
     }, 
     numberOfElementsToBe(cssSelector("div.modal-backdrop"), 0) 
)); 
Các vấn đề liên quan