2011-12-29 75 views
1

考慮以下情形: -硒如何檢查是否元素存在或不

的一家書店,網站擁有的圖書數量,每本書有一個像作者姓名,出版商,一些細節等主要頁面顯示號碼並點擊頁面上的任何書籍,彈出窗口打開,顯示該書的詳細信息。主html頁面如下所示。

鏈接 書1

<book id="abc"> 
    <a href="linkAddress">link</a> 
    <div class="name">Book 2</div> 
</book> 

<book id="abc"> 
    <a href="linkAddress">link</a> 
    <div class="name">Book 3</div> 
</book> 

<book id="abc"> 
    <a href="linkAddress">link</a> 
    <div class="name">Book 4</div> 
</book> 

<book id="abc"> 
    <a href="linkAddress">link</a> 
    <div class="name">Book 5</div> 
</book> 

我想獲取的所有書細節,因此我所做的是我拿來的所有書籍元素的列表,從

主頁
List<WebElement> items = fireFoxDriver.findElements(By.id("abc")); 

然後遍歷該列表並單擊每個el EMENT逐一打開一個彈出窗口,顯示書中

for(WebElement itemDetails : items){ 
    itemDetails.click(); 
    //After clicking the element pop-up opens which shows details of this particular book. 
    //Get details of this particular book from pop-up. 
} 

的細節和獲取來自打開彈出式窗口,然後讓所有需要的信息後關閉彈出窗口並移動到下一個元素我所需要的細節。

現在的問題是我使用itemDetails.click()打開彈出窗口,但有時我打開彈出窗口時出現以下錯誤。我不知道如何處理這些錯誤,請引導我。元素在主頁面上我沒有在打開彈出窗口時更改主頁面,但仍然收到DOM錯誤。

  1. org.openqa.selenium.StaleElementReferenceException:元素沒有 不再附加到DOM
  2. com.thoughtworks.selenium.SeleniumException:超時等待動作完成

感謝。

+0

你在處理彈出窗口嗎?你需要明確地選擇彈出窗口對它做任何事情,然後你需要明確地選擇父窗口 – Edd 2011-12-29 15:00:14

回答

4

您可能會遇到競賽狀況。

如果

List<WebElement> items = fireFoxDriver.findElements(By.id("abc")); 

和循環

for(WebElement itemDetails : items){ 
    itemDetails.click(); 
} 

那麼很可能是itemDetails不再屬於DOM,你會得到一個StateElementReferenceException之間 的頁面變化。

類似的問題描述爲here。您可以嘗試顯式等待,直到頁面處於不會更改的狀態(可能使用WebDriverWait)。

1

您可以嘗試在您想要與它進行交互之前自行查找每個元素,而不是迭代整個列表以便它們不會過時。你可以使用如下的xpath來完成:

int elementCount = fireFoxDriver.findElements(By.id(「abc」))。計數;

對(INT I = 0;我< elementCount中;我++){

firefoxDriver.findElement(By.XPath(的String.Format( 「//書[ID = \」 ABC \「] [{ 0}]「,i.ToString())))。click();

}