Java webdriver:元素不可见异常

Java webdriver:元素不可见异常,java,selenium,webdriver,Java,Selenium,Webdriver,我有以下问题。我有一个隐藏的下拉列表,因此当我选择并运行测试时,会出现以下错误: 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)

我有以下问题。我有一个隐藏的下拉列表,因此当我选择并运行测试时,会出现以下错误:

 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>

联合国登记册
安全
呼叫中心
退单
普雷文·乔奥是个骗子
信用分析
扭转
金融监管局

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

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


s、 按值选择(“7ea4b4ea-4f06-4d27-9541-1b0cf3f2aa22”)

我完全同意sircapsalot。您应该掌握应用程序业务逻辑并“像用户一样做”。并且只在解决方法中使用此破解

答复:

这样试试


document.getElementById('formLevel:levels\u input')。选项[3]。selected=“true”
由于
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的类名

嗨,这可能有很多原因。我也多次面对这个问题,并用不同的方法解决

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

2-使用唯一的xpath-使用xpath方式

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


我在这里记录了所有解决方案

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

为什么不创建一个有效的测试用例使其可见,例如,
单击此,然后在元素可见时更改下拉列表
操纵隐藏元素是错误的测试逻辑,因为用户不会这样做。此外,如果元素应该可见,并且抛出此错误,那么我将检查您的选择器。您可能选择了错误的元素。选择器没有问题,因为我可以找到元素,但无法选择选项。PS添加了html代码。@user2752065你试过我的答案了吗?@sircapsalot实际上,用户会这样做的。jQueryUI始终使用隐藏元素。这似乎很难测试。我不想使用visible jquery ui元素,因为图形部门明天可能会更改它。持有该值的基本元素是最稳定的测试方法。我同意这个答案。您不需要在这种类型的交互上使用FluentWait(忽略异常)(因为div单击会立即产生预期结果),因此WebDriverWait在这种情况下是完美的。