【问题标题】:Selenium Select Hidden Drop Down MenuSelenium 选择隐藏的下拉菜单
【发布时间】:2013-06-29 03:30:54
【问题描述】:

大家下午好,

所以我的问题是我试图在隐藏的下拉菜单中选择字段。以下是上述下拉菜单之一的 HTML 代码。

<div id="mainForm:defectPriorityField" class="ui-selectonemenu ui-widget ui-state-default ui-corner-all ui-helper-clearfix" style="width:120px">
<div class="ui-helper-hidden">
<select id="mainForm:defectPriorityField_input" name="mainForm:defectPriorityField_input">
<option value="1-Urgent">1-Urgent</option>
<option value="2-Very High">2-Very High</option>
<option value="3-High">3-High</option>
<option value="4-Medium">4-Medium</option>
<option value="5-Low">5-Low</option>
</select>

现在我已经阅读了有几种方法可以做到这一点。下面似乎是最受欢迎的。

String cssSelector= ...
JavascriptExecutor js = (JavascriptExecutor) driver;
    StringBuilder stringBuilder = new StringBuilder();
    stringBuilder.append("var x = $(\'"+cssSelector+"\');");
    stringBuilder.append("x.click();");
    js.executeScript(stringBuilder.toString());

下拉菜单的 xpath 是 //*[@id="mainForm:defectPriorityField_input"] 我对此比较陌生,不确定如何生成或获取 cssSelector。请如果有人能指出我正确的方向,将不胜感激。

【问题讨论】:

  • 我认为正确的方法是实际单击下拉菜单以显示不再隐藏并且可以轻松选择它们的选项。你试过这样做吗?
  • 是的,我可以这样做,但是这样做还有另一个问题,一些下拉菜单是动态的,其中的内容正在发生变化。在下拉列表中选择项目的唯一方法是通过它的 xpath。这取决于下拉菜单的大小是否增加等而变化。
  • 我原本打算这样做。选择参数SelectField = new Select(driver.findElement(By.id("mainForm:defectPriorityField_input"))); parameterSelectField.selectByVisibleText("5-Low");但是由于是隐藏字段,所以选择方法是行不通的。
  • 隐藏字段不适用于 selenium,您将不得不使用一些狡猾的 js,我个人从未能够开始工作,但其他人已经取得了成功,所以也许您会比我有。
  • 您所指的动态下拉菜单我想不是随机的吧?它们是否有您可以关闭的文本或控制它们包含的内容的先前选择?

标签: java xpath selenium webdriver css-selectors


【解决方案1】:

这是我要采取的方法,首先单击下拉菜单,然后选择一个选项:

WebElement dropdown = driver.findElement(By.xpath("//div[@id=\"mainForm:defectPriorityField\"]);
dropdown.click();

WebDriverWait waitForOptions = new WebDriverWait(driver, 3);
waitForOptions.until(ExpectedConditions.visibilityOfElementLocated(By.xpath("//div[@id=\"mainForm:defectPriorityField_input\"]")));

WebElement option = driver.findElement(By.xpath("//div[@id=\"mainForm:defectPriorityField_input\"]/option[text()=\"1-Urgent\"]"));
option.click();

请原谅任何语法错误,但本质上就是这样。在选项元素的最后一条语句中,您可以将文本“1-Urgent”替换为变量或您喜欢的任何内容。

【讨论】:

  • 不幸的是,这不起作用,收到以下错误。修复小语法问题后。引起:org.openqa.selenium.remote.ErrorHandler$UnknownServerException:无法定位元素:{"method":"xpath","selector":"//div[@id=\"mainForm:defectPriorityField_input\"]/选项[text()=\"1-紧急\"]"}
  • 当你运行你的程序时,你真的能看到下拉菜单是否显示吗?如果将 xpath 粘贴到 firebug 中,它会起作用吗?
【解决方案2】:

如果一个元素是隐藏的,你不应该使用它。因为用户也不会。

如果不是,那为什么不使用 SelectElement?

    SelectElement sel = new SelectElement(driver.FindElement(By.Id("Id")));
    sel.SelectByValue("Value");

【讨论】:

  • 这不是真的,下拉菜单在网页上可见。元素的 Select 版本是隐藏的,只有标签 id 和 div id 可见,因此 Select 类和方法会引发错误。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-10-14
  • 2023-03-25
  • 1970-01-01
  • 2022-11-11
  • 2017-10-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多