2016-07-22 111 views
1

以前審查過有關此問題的帖子,但問題仍然存在。 http://preview.harriscountyfws.org/是一個公共站點,屬於這個問題。Selenium Webdriver使用Java的ElementNotVisibleException

我試圖點擊一個下拉菜單並從Rainfall下拉列表中選擇「Channel Status」。

我得到以下錯誤:

Exception in thread "main" org.openqa.selenium.ElementNotVisibleException: element not visible: Element is not currently visible and may not be manipulated

我附上的代碼截圖,但你也可以訪問該網站,按F12看代碼。

這裏是我的基礎上,研究當前的代碼到目前爲止,我已經做了:

Select dropdown = new Select(driver.findElement(By.id("siteType"))); 

    WebElement triggerDropDown = driver.findElement(By.className("k-i-arrow-s")); 
    triggerDropDown.click(); 

    dropdown.selectByVisibleText("Channel Status"); 
    dropdown.selectByIndex(1); 

顯示工作(dropdown.select ...) 兩種結果ElementNotVisibleException最後兩個代碼語句都不是。

這是不正確的,因爲通過按triggerDropDown.Click(),選擇是可見的!

Click Here For Screenshot

回答

0

這是一個奇怪的。我可以輕鬆點擊下拉列表,但點擊「渠道狀態」不起作用。有一些關於那個不正常的下拉菜單。我嘗試了典型的WebDriverWait,但它不起作用。硒沒有正確地等待或其他事情正在發生。我很少推薦Thread.sleep(),但在這種情況下我無法找出解決方法。

下面的代碼工作。

String searchText = "Channel Status"; 
driver.findElement(By.cssSelector("span.k-widget.k-dropdown.k-header")).click(); 
Thread.sleep(1000); 
driver.findElement(By.xpath("//li[text()='" + searchText + "']")).click(); 
+0

更好。我會一直等到我接受答案,因爲其他人可能會回覆,我想看看我們都可以瞭解這一點。我的懷疑,我可能是錯誤的,也許屏幕分爲面板,你必須以某種方式選擇一個或另一個面板,以便能夠使該面板中的組件「可見」 –

+0

JeffC。在你的第二行,你會說「driver.findElement(By.cssSelector(」span.k-widget.kdropdown.k-header「))。click。它只是找到第一個出現的地方?現在我已經準備好從當前選項卡中選擇「最後X次降雨」下拉菜單中的某個東西,但我遇到了問題,因爲其周圍的元素也被命名爲「span.k-widget.kdropdown.k-header」。所以這是一個挑戰。如果它是基於找到該文本的第一次出現,那麼再次,它不是最佳代碼。 –

+0

是的,它找到了第一個。如果您需要選擇除第一個之外的其他內容,則必須更改選擇器。 – JeffC

1

使用下面的代碼:

driver.get("http://preview.harriscountyfws.org/"); 
driver.manage().window().maximize(); 
Thread.sleep(2000);//use wait using until instead of this wait 

WebElement elem = driver.findElement(By.xpath("//span[text() = 'Rainfall']")); 
elem.click(); 
Thread.sleep(2000); 

for(int i = 0; i <= 2; i++){//2 is used bacause u have 2 options 
    Actions actions = new Actions(driver); 
    actions.sendKeys(Keys.DOWN).build().perform();//press down arrow key 
    Actions actions2 = new Actions(driver); 
    actions2.sendKeys(Keys.ENTER).build().perform();//press enter 
} 

這會點擊通道狀態按鈕。

+0

您的代碼確實有效。我不喜歡依靠訂單和分期付款。我想使它更容易維護。至少它可以工作。那很好。我試圖給你投票。但我不能,因爲我是新的,沒有「聲譽」。我不相信這是值得降級的。這是一個很好的答案。我希望有更好的東西。所以現在,我保持這個問題的公開。 –

+0

當我們編寫測試腳本時,我們試圖以一種不需要經常更換它們的方式來完成它們。現在,在這裏,如果您添加項目,更改框中項目的順序等,則事情不會按預期工作。此外,我可以使默認不是在我的下拉列表中的「降雨量」,而是其他的東西。諸如「selectbyvisibletext」等方法不會存在,如果這是唯一的方法。如果有一些技術上的理由說明爲什麼你們是唯一的方法,那麼也許我們可以制定友好的方法來找到特定文本的索引等等 - 並且儘量讓整個事情不要太依賴於那些變化的因素。 –

+0

在循環中你可以發送索引號....我會稍後更新我的答案,以便你可以重新使用它....我現在不是我的筆記本電腦面前....感謝 – noor

相關問題