2013-01-22 80 views
3

我們如何等待IWebElement被重新連接到DOM?我的情況是這樣的,我從dropdown1中選擇一個值,然後在dropdown2上單擊數據綁定。所以當我的測試像從Dd1中選擇「foo」那樣,然後從Dd2中選擇「bar」 - >我會得到一個異常,因爲Dd2還沒有被渲染,所以有一個競爭條件。 現在,我知道,我們有WebDriverWait類,我們可以使用方法之前水木清華這樣的:Selenium,等待元素,頁面對象模型,c#綁定

WebDriverWait wait = new WebDriverWait(driver, TimeSpan.FromSeconds(5)); 
wait.Until(By.Id("foo")); 

但我真的不希望把定位符字符串(「富」),以我的測試邏輯,因爲它似乎正在破壞使用頁面對象模型的觀點。當使用Page對象模型我已經有IWebElement實例

[FindsBy(How = How.Id, Using = "ctl00_MainContentPlaceHolder_actionButtonBarControl_btnSave")] 
    public IWebElement BtnSave { get; set; } 

所以,你知道的任何方式來暗示等待IWebElement要準備好溝通?

+0

左右,但仍然在尋找良好的解決方案 –

+0

內部靜態無效WaitForElementToBeReadyAndSelectByText( IWebElement webElement,字符串s) { 爲(VAR I = 0; I <10;我++){ 嘗試 { 變種 元素=新SelectElement(webElement); element.SelectByText(s); 突破; } catch(StaleElementReferenceException) { Thread.Sleep(200); } } } –

+1

您是否找到一個好的解決方案呢?我正在爲完全相同的事情而苦苦掙扎。 – Dymond

回答

1

如果你不想使用locator values意味着你可以去隱式等待,而不是使用顯式等待。 Implicit等也使driver實例等待一段時間。

Actual difference to Explicit Wait is that it will tell Web driver to poll the DOM for a certain amount of time when trying to find an element or elements if they are not immediately available.The default setting is 0.

代碼:

driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS); 

有一點要記住的是,一旦隱含的等待設置 - 它仍將是webdriver的對象實例的生命。

欲瞭解更多信息使用這個鏈接http://selenium.googlecode.com/svn/trunk/docs/api/java/org/openqa/selenium/WebDriver.Timeouts.html#implicitlyWait(long,java.util.concurrent.TimeUnit)

3

您好我知道它有點晚了,但我有同樣的問題,我做了以下(使用代碼)傳開它:

WebDriverWait wait = new WebDriverWait(driver, TimeSpan.FromSeconds(5)); 
wait.Until(By.Id(_pageModel.BtnSave.GetAttribute("id")); 

然後它只是返回ID屬性的值,並停止使用元素查找來污染測試代碼。希望能幫助到你。

0

我們所做的是傳遞一個原始選擇器文本,如seleniumRC css=a, xpath=b

然後我們有一個findElement方法,將解析請求,得到相應的By,並在我使用它,如下所示的那一刻搜索元素