2016-07-25 58 views
1

在我的代碼,我需要「請稍候...」 UI上面面板所遮蔽先消失,然後移動到面板下方,因此我把明確的等待特定塊跨度。但即使上面的面板被阻止,其保存功能仍在繼續,但面板的點擊功能仍在繼續。明確的等待中硒的webdriver不工作

driver.findElement(By.id("saveHouseholdMember")).click(); 
WebDriverWait uiBlock = new WebDriverWait(driver, 30); 
uiBlock.until(ExpectedConditions.invisibilityOfElementWithText(By.xpath("/html/body/div[2]/form[1]/div/table/tbody/tr/td/span"), "Please wait...")); 
driver.findElement(By.id("disabilityFlagRadio")).click(); 

在這裏,點擊保存按鈕後,該面板被「Please wait ...」消息阻止。驅動程序應該等到上面的面板上的「Please wait ...」文本消失,然後才能執行下面的書面點擊功能,但不會像預期的那樣發生。上述面板的保存通常需要15秒左右。

我提到以下鏈接爲好,但找不到有用的投入。 Wait is not working in selenium webdriver

+1

在「Please wait ...」消息變爲可見之前,硒是否有可能超過等待時間? – Woodham

+0

+1,請嘗試等待面板首先可見,以確保硒在顯示後開始等待面板消失。 – Kudin

+1

如果您確信顯示該面板,您可以等待要顯示的下一個元素 'WebElement元= wait.until( ExpectedConditions.visibilityOfElementLocated(By.id( 「disabilityFlagRadio」)));' – Harish

回答

2

所以我的猜測是,你的測試是發現和移動過去的元素的隱蔽性檢查顯示面板之前。這是因爲首先出現的是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") 
+0

你解釋是非常好的..真的很感謝..但爲什麼你提供跨度可視性的解決方案,然後如果可以簡單地通過等待下一個元素爲'WebElement element = wait.until(ExpectedConditions.visibilityOfElementLocated(By .id(「disabilityFlagRadio」)));'而不是?? –

+0

聽起來,頁面上有兩個部分,第一部分影響上部分,另一部分的ID爲'disabilityFlagRadio'。如果位於該屏幕上的元素在屏幕上可見,而上面的部分正在保存,那麼只需等待它顯示就會有相同的競爭條件(例如,在「保存」彈出窗口出現之前,硒可能會找到該元素並說「是」 ,這是可見的「)。但是,如果這是不正確的,並且在完成保存後出現該元素* only *,則會更簡單/更好。 –