2010-07-17 72 views
14

下面的代碼片段工作正常,但我有與wait.until()線有點麻煩:如何在Wait.until()中使用selenium 2 PageFactory init元素?

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

它的工作原理,但我想給我的PageFactoryWebElementhomePageLink代替:

wait.until(new ElementPresent(homePageLink)); 

是有沒有辦法做到這一點?

這些新的Selenium 2功能讓我頭腦發昏,我找不到太多文檔。

謝謝。

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

我用SlowLoadableComponent代替。它允許我在isLoaded()和load()之間放置一個延遲,以便頁面不斷重試直到頁面加載。 – djangofan 2012-02-25 00:49:53

回答

19

我使用PageFactoryAjaxElementLocatorFactory - PageFactory爲硒2頁的支撐類對象,其使用的是圖案,並且AjaxElementLocatorFactory是出廠的元件定位器。在你的情況下,構造函數將是這樣的:

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

該代碼將等待最多15秒,直到通過註釋指定的元素將出現在頁面上,你的情況homePageLink將由XPath的定位。您不需要使用ElementPresent類。

+1

這工作,但也會SlowLoadableComponent。所以,問題是,哪種方法更好,哪些情況? – djangofan 2012-02-25 01:05:21

+0

即使它已經有一段時間了,你能爲我澄清一些事情嗎? Selenium API必須已經改變了一些,但是現在AjaxElementLocatorFactory有3個參數而不是2個。您能否介紹第二個參數應該是什麼? – 2012-07-06 11:10:11

+0

有沒有辦法在C#中做到這一點?我無法找到AjaxElementLocatorFactory。 – chill182 2014-02-18 18:09:47

1

AjaxElementLocatorFactory在內部使用SlowLoadableComponent。檢查源代碼here

2

有人要求在C#上實現。

這就是:

IWebDriver driver = new ChromeDriver(); 
RetryingElementLocator retry = new RetryingElementLocator(driver, TimeSpan.FromSeconds(5)); 
IPageObjectMemberDecorator decor = new DefaultPageObjectMemberDecorator(); 
PageFactory.InitElements(retry.SearchContext, this, decor); 
相關問題