2014-01-07 34 views
0

我正在尋找一些關於如何選擇WebElement的建議。 當我點擊一個按鈕創建一個新的'頁面'時,給定的值是動態的,因爲它是完全隨機的而不是順序的。我希望它會遵循如下內容:頁面1 = 0,頁面2 = 1,頁面3 = 2等。動態創建值時使用的最佳方法?

默認情況下,我以頁面開頭,其值爲c3。雖然當我觸發一個按鈕來創建新頁面的值如下所示:

<select class="j-currentPage f-feature-A" name="currentPage"> <option value="c3">New Page</option> <option value="c277">New Page 2</option> <option value="c383">New Page 3</option> <option selected="" value="c461">New Page 4</option> </select> 

所以,當我嘗試使用以下命令:

List<WebElement> option = chrome.findElements(By.tagName("option")); 

    option.get(0).click(); 
    option.get(1).click(); 
    option.get(0).click(); 

這顯然未能爲值是C277,C346等而且無法知道新課程中的價值觀,因爲它們總是會有所不同。

stacktrace拋出一個StaleElementReferenceException,因爲它不在DOM中。

如何在數值完全隨機時選擇每個頁面?

我正在使用Webdriver和JUnit4。

編輯

測試方法:創造一些新的網頁。

@Test 
public void createANewPage(){ 
    WebDriverWait wait = new WebDriverWait(chrome, 60); 

    wait.until(ExpectedConditions.visibilityOfElementLocated(By.cssSelector("select.j-currentPage.f-feature-A[name=\"currentPage\"]"))); 

    WebElement newPage = chrome.findElement(By.cssSelector("span.j-addViewBtn.ss-layers")); 
    newPage.click(); 

    List<WebElement> option = chrome.findElements(By.tagName("option")); 

    option.get(1).click(); 

    option.get(0).click(); 
} 

再後來幾個測試中,我想再打創建的網頁

@Test 
public void goToPage(){ 

    new WebDriverWait(chrome, 60).until(ExpectedConditions.visibilityOfElementLocated(By.cssSelector("select.j-currentPage.f-feature-A[name=\"currentPage\"]"))); 
    List<WebElement> option = chrome.findElements(By.tagName("option")); 

    option.get(0).click(); 
    option.get(1).click(); 
    option.get(0).click(); 
} 

我在第三option.get(0).click();

點收到org.openqa.selenium.StaleElementReferenceException但是我感覺好像由於這些值是動態創建的,因此我正在接近這種錯誤方式<option value="c3">New Page</option>
<option value="c207">New Page 2</option>
<option value="c288">New Page 3</option>
<option selected="" value="c366">New Page 4</option>

+0

這裏有一個問題。你想選擇任何一個選項嗎?或者一個特定的? –

+0

我想有能力選擇我想要的網頁。因此,我想在稍後的測試中在頁面之間切換一個特定的頁面。 –

+0

我沒有理解一些觀點。一旦你選擇了一個選項,它會轉發到其他頁面,你問的是「我怎樣才能選擇每一頁」,所以你想要的東西不清楚。你可以請更新你的問題一些更多的細節。 –

回答

0

StaleElementReferenceException意味着它不在DOM中。這意味着DOM發現該對象後發生了變化,因此可能會被刪除或更改。更改coudld是由於頁面重新加載或通過javascript刷新HTML。無論哪種方式,Webdriver都會拋出錯誤,因爲它認爲在頁面更改後重新繪製對象可能是個好主意。

如果你重新設計元素,那麼它將起作用。您正在通過標籤名稱查找,因此ID已更改的事實應該沒有影響。

以下方法可行,但確實存在性能問題;

chrome.findElements(By.tagName("option")).get(0).click 
chrome.findElements(By.tagName("option")).get(1).click 
chrome.findElements(By.tagName("option")).get(2).click 

將有一個更好的方式來處理你的問題,爲具體應用,但希望瞭解什麼過時的元素實際上表明,將幫助您解決問題。

+0

你可能有任何例子來解釋startsWith,endsWith,包含方法?我有一種感覺,這可能是正確的方法,可能使用類似contains(「新頁面2」);? –

+0

老實說,我不完全理解你的問題,你的web元素列表可以通過TagName找到ID的差異將不會產生任何影響您可以確認何時獲得StaleElementException和測試中的上下文,甚至可以顯示整個測試方法 –

+0

我在問什麼是應用程序自動創建動態值時採取的最佳方法。正如你所說,ID /值應該不重要,所以我應該看看使用xpath,就像這樣:'WebElement page1 = chrome.findElementByXPath(「// option [con tains(。,'New Page')]「); page1.click();'這工作。 –

0

FindElement()策略都不支持使用正則表達式來查找元素。

雖然有使用正則表達式的另一種方式,可以幫助你

List<WebElement> option = chrome.findElements(By.tagName("option")); 

現在的選項和gettext的循環。然後做編程正則表達式檢查 下面是一個演示代碼不會運行。請轉移到jave

foreach(WebElement link in links) 
{ 
    string text = link.Text; 
    if (Regex.Match("your Regex here", text)) 
    { 
     matchingLinks.Add(text); 
    } 
} 

foreach(string linkText in matchingLinks) // now you have the texts even if they are dynamics 
{ 
    WebElement element = driver.findElement(By.LinkText(linkText)); 
    element.Click(); 
    // do stuff on the page navigated to 
    driver.Navigate().Back(); 
} 
+0

Css選擇器具有簡單的註冊表支持開始於,結束於幷包含。 XPath也有這些和可能更多 –

+0

@APaul我希望我可以說這是非常有用的,但我仍然沒有解決我的問題。儘管我非常感謝您嘗試提供幫助。 –

+0

是的CSS選擇器或xpath有它自己的正則表達式支持我在說「FindElement」。沒有找到元素給任何具體的suppoty通過正則表達式找到文本匹配。這就是我的意思。 –

0

好吧,我剛剛設法解決了這個問題的貢獻者的幫助下解決了這個問題。

看起來好像我只是需要使用xpath而不是List<WebElement>,所以下面的代碼現在選擇我想要的頁面。

@Test 
public void jGoToPage(){ 

    new WebDriverWait(chrome, 60).until(ExpectedConditions.visibilityOfElementLocated(By.cssSelector("select.j-currentPage.f-feature-A[name=\"currentPage\"]"))); 

    WebElement page1 = chrome.findElementByXPath("//option[contains(.,'New Page')]"); 
    page1.click(); 

    WebElement page2 = chrome.findElementByXPath("//option[contains(.,'New Page 2')]"); 
    page2.click(); 

    WebElement selectPage1Again = chrome.findElementByXPath("//option[contains(.,'New Page')]"); 

    selectPage1Again.click(); 

也許不是最好的代碼,但如果有人想提出一個更好的方式來完善它,請評論,以便其他人可以學習。

我宣佈New Page兩次的原因是因爲我再次收到staleElementReferenceException。因此,通過簡單地試圖page2.click();後立即執行page1.click();是當發生這就是爲什麼我宣佈它作爲selectPage1Again

我也用這個question幫助解決。

相關問題