6

我有以下问题。我有一个隐藏的下拉菜单,所以当我选择并运行测试时,我收到以下错误:

 org.openqa.selenium.ElementNotVisibleException: element not visible: Element is not currently visible and may not be manipulated
  (Session info: chrome=30.0.1599.101)

这是我的选择:

Select s = new Select(dropDown);
s.selectByVisibleText("CHARGEBACK");

有没有绕它走来操纵隐藏的元素?我在其中一篇文章中找到了以下代码:

 JavascriptExecutor jse = (JavascriptExecutor) driver;
 jse.executeScript("arguments[0].scrollIntoView(true);", element);

这是html代码:

 <div class="ui-helper-hidden">
<select id="formLevel:levels_input" name="formLevel:levels_input">
<option value="541fac58-5ea8-44ef-9664-e7e48b6c6a3c">Seleccione un Registro</option>
<option value="dafc799c-4d5e-4b02-a882-74cb6ad98902">SECURITY</option>
<option value="e5416086-2036-4cd0-b23e-865747aa3f53">CALL CENTER</option>
<option value="7ea4b4ea-4f06-4d27-9541-1b0cf3f2aa22">CHARGEBACK</option>
<option value="0f915120-7b8f-4a33-b063-5d20a834b655">PREVENÇÃO A FRAUDE</option>
<option value="a8ef13e8-f4a5-43b8-a668-b769f6988565">ANALISE DE CREDITO</option>
<option value="83b65a26-d4cd-43d3-b3fa-2f7894ca454a">SUPORTE A CONTA</option>
<option value="163d0db9-590c-47a7-a271-218b2d27d8d9">REGULARIZAÇÃO FINANCEIRA</option>

在这种情况下它不起作用。任何帮助,将不胜感激。

4

5 回答 5

7

由于WebDriver试图模拟真实用户,它不能与不可见/隐藏的元素交互。要解决您的问题,我认为您需要先单击div这将使下拉列表可见,然后从下拉列表中选择选项。我会推荐这种方法,而不是纯 Javascript 方式,因为它会模拟真实用户。试一试,

WebDriverWait wait = new WebDriverWait(driver, 300);
WebElement triggerDropDown = driver.findElement(By
                .className("ui-helper-hidden"));
triggerDropDown.click();
WebElement selectElement = wait.until(ExpectedConditions
                  .visibilityOfElementLocated(By.id("formLevel:levels_input")));
Select select = new Select(selectElement);
select.selectByVisibleText("SECURITY");

编辑更新了 triggerDropDown 的类名

于 2013-10-29T01:01:35.150 回答
6

嗨,这可能有很多原因。我也多次遇到这个问题并使用不同的方式解决。

1-使用也称为显式等待的 WebdriverWait

2-使用独特的xpath-使用xpath方式。

3-获取元素的大小,然后单击或对第一个执行任何操作。

我在这里记录了所有解决方案如何解决元素不可见异常

于 2015-08-04T10:14:41.743 回答
1

我绝对同意sircapsalot。您应该掌握应用程序业务逻辑并“像用户一样行事”。并且仅将此hack用于解决方法。

回答:

试试这个方法

document.getElementById('formLevel:levels_input').options[3].selected = "true"

于 2013-10-28T17:12:09.903 回答
0

尚未对此进行测试,但是以下是否有效?

s.selectByValue("7ea4b4ea-4f06-4d27-9541-1b0cf3f2aa22");

于 2013-10-28T17:06:39.957 回答
0

除了前面的回答提出的原因和问题外,我还遇到了另一个值得一提的原因。在我的例子中,页面上的 JavaScript 必须在单击页面上的链接后运行,才能使我想要访问的元素可见。只要您的驱动程序启用了 JavaScript 就可以了。就我而言,我在没有 JavaScript 的情况下运行,因此即使以编程方式“单击”链接,元素也不会变得可见。我使用HtmlUnitDriver的是默认设置。最终我切换到ChromeDriver. (您可以在 上启用 JavaScript HtmlUnitDriver,但出于其他原因,这对我来说还不够。)

于 2016-08-17T14:03:07.837 回答