所以我的猜測是,你的測試是發現和移動過去的元素的隱蔽性檢查顯示面板之前。這是因爲首先出現的是Selenium測試檢查或使網頁顯示的網站的競爭狀況。你可以(類型)通過首先檢查面板出現,然後檢查它已經消失來解決這個問題。這限制了這一點的一些競爭條件方面。它不是不是然而,修復競賽狀況問題。在下面的例子中,如果面板出現,然後消失前的硒代碼執行尋找面板可見它將會失敗。最好的辦法是尋找那些代碼導致面板消失並做套它是完整的,但我不知道的代碼或頁面的邏輯當一些狀態。一個例子是,如果Web開發人員有保存操作(在完成時)將CSS類添加到某個元素。然後你的測試可以等待一個元素來獲得這個類。簡單的例子(與種族條件):
// Do stuff to get to the page needed for the test
driver.findElement(By.id("saveHouseholdMember"))
.click();
// Make sure the panel first appears and then disappears
By panelBy = By.xpath("/html/body/div[2]/form[1]/div/table/tbody/tr/td/span");
new WebDriverWait(driver, 30).until(ExpectedConditions.visibilityOfElementLocated(panelBy));
new WebDriverWait(driver, 30).until(ExpectedConditions.invisibilityOfElementLocated(panelBy));
// Panel is gone, click the next button
driver.findElement(By.id("disabilityFlagRadio"))
.click();
注意,在創建網絡驅動程序等待的30
意味着它會繼續檢查長達30秒所需的可見性狀態匹配的元素。如果在此期間沒有找到具有正確能見度狀態的匹配元素,則將拋出TimeoutException
。此外,請注意,該面板正由您提供的XPath定位。但是,我不建議使用XPath表達式,因爲它是絕對的。我儘可能避免使用XPath作爲Selenium定位器,因爲它可能非常脆弱並且很難讀取以用於測試維護。通常你可以得到通過的方式,是多清潔閱讀其他定位策略(如CSS選擇器,姓名,身份證等)相同的元素(更容易)。當你做絕對需要的XPath(例如,也許你需要尋找的頁面上的一些特定文本),然後使用相關的XPath。對於下面的(簡單的)例子:
<html>
<body>
<div>
<span>
<input name="foo"></input>
</span>
</div>
</body>
</html>
如果使用絕對路徑的XPath發現輸入,它應該是這樣的:
By.xpath("/html/body/div/span/input")
但是,選擇將打破,如果是整個鏈條的任何部分更改(例如添加一個不會改變行爲的div會破壞測試)。相反,你可以使用相關的XPath:
By.xpath("//input[@name='foo']")
注意,即使這個例子是有缺陷的,只是相對的XPath的例子。如果你真的看到了上面的代碼片段,你可能應該這樣做:
By.name("foo")
在「Please wait ...」消息變爲可見之前,硒是否有可能超過等待時間? – Woodham
+1,請嘗試等待面板首先可見,以確保硒在顯示後開始等待面板消失。 – Kudin
如果您確信顯示該面板,您可以等待要顯示的下一個元素 'WebElement元= wait.until( ExpectedConditions.visibilityOfElementLocated(By.id( 「disabilityFlagRadio」)));' – Harish