2010-07-17 24 views
14

Đoạn mã dưới đây hoạt động tốt, nhưng tôi đang gặp một chút rắc rối với wait.until() dòng:Làm thế nào để sử dụng selenium 2 PageStactory init Elements với Wait.until()?

wait.until(new ElementPresent(By.xpath("//a[@title='Go to Google Home']"))); 

Nó hoạt động nhưng tôi muốn gửi PageFactoryWebElementhomePageLink thay tôi:

wait.until(new ElementPresent(homePageLink)); 

Is có cách nào để làm điều đó không?

Các tính năng mới của Selenium 2 bị vướng víu này có đầu óc hơi quay và tôi không thể tìm thấy nhiều tài liệu.

Cảm ơn.

public class GoogleResultsPage extends TestBase { 

    @FindBy(xpath = "//a[@title='Go to Google Home']") 
    @CacheLookup 
    private WebElement homePageLink; 

    public GoogleResultsPage() { 
     wait.until(new ElementPresent(By.xpath("//a[@title='Go to Google Home']"))); 
     assertThat(driver.getTitle(), containsString("Google Search")); 
    } 
} 

public class ElementPresent implements ExpectedCondition<WebElement> { 

    private final By locator; 

    public ElementPresent(By locator) { 
     this.locator = locator; 
    } 

    public WebElement apply(WebDriver driver) { 
     return driver.findElement(locator); 
    } 
} 
+0

tôi sử dụng SlowLoadableComponent để thay thế. Nó cho phép tôi đặt sự chậm trễ giữa isLoaded() và load() để trang tiếp tục thử lại cho đến khi trang được tải. – djangofan

Trả lời

19

tôi sử dụng PageFactory với AjaxElementLocatorFactory - PageFactory là một lớp hỗ trợ cho các Selenium 2 Trang Objects mẫu mà bạn đang sử dụng, và AjaxElementLocatorFactory là nhà máy cho các bộ định vị phần tử. Trong trường hợp của bạn các nhà xây dựng sẽ trông giống như:

public GoogleResultsPage() { 
    PageFactory.initElements(new AjaxElementLocatorFactory(driver, 15), this); 
} 

Mã này sẽ chờ đợi tối đa là 15 giây cho đến khi các yếu tố theo quy định của các chú thích sẽ xuất hiện trên trang web, trong trường hợp của bạn homePageLink sẽ được xác định bằng cách xpath. Bạn sẽ không cần sử dụng lớp ElementPresent.

+1

Điều này làm việc nhưng vì vậy sẽ SlowLoadableComponent. Vì vậy, câu hỏi là, phương pháp nào hoạt động tốt hơn và trong tình huống nào? – djangofan

+0

Mặc dù đã lâu rồi bạn có thể làm rõ điều gì đó cho tôi không? API Selenium phải thay đổi một chút, nhưng bây giờ AjaxElementLocatorFactory có 3 tham số thay vì 2. Bạn có thể đưa ra một thông số thứ 2 cần thiết không? –

+0

Có cách nào để thực hiện việc này trong C# không? Tôi không thể tìm thấy AjaxElementLocatorFactory. – chill182

1

AjaxElementLocatorFactory sử dụng SlowLoadableComponent trong nội bộ. Kiểm tra mã nguồn here

2

Đã có yêu cầu triển khai trên C#.

Ở đây là:

IWebDriver driver = new ChromeDriver(); 
RetryingElementLocator retry = new RetryingElementLocator(driver, TimeSpan.FromSeconds(5)); 
IPageObjectMemberDecorator decor = new DefaultPageObjectMemberDecorator(); 
PageFactory.InitElements(retry.SearchContext, this, decor); 
Các vấn đề liên quan