2016-07-22 113 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

相关问题