Selenium Webdriver无法在下拉列表中选择值

时间:2015-03-17 01:38:58

标签: java select selenium xpath webdriver

我正在尝试使用Webdriver实现Selenium Java。 基本上,我有一个空白字段的网站。用户单击该字段后,将出现一个包含5个选项的下拉列表,用户应选择一个选项。

代码看起来像这样

<!-- language: lang-html -->
<div class="default-form w-border scheduleAddFrom" style="display: block;">
<div>
<div class="section frameless nopadding nomargin" data-form-element="SectionHeading" style="min-width: 100%;">
<div class="section-body frameless nopadding nomargin">
<div class="default-form">
<div class="form-row required-message hidden" style="min-height: 25px;">
<div class="form-row print-avoid-page-break" data-form-element="FieldEdit" style="min-height: 25px;">
<label for="">Department</label>
<input id="Schedule-00-Row136153aa-9fa8-499b-8458-2b155443223bE-TaskId-Display" class="ui-autocomplete-display validate widget" type="text" autocomplete="off">
<span class="ui-autocomplete-display-icon"></span>
<div class="subhidden">
<select id="Schedule-00-Row136153aa-9fa8-499b-8458-2b155443223bE-TaskId" class="validate widget " data-default-value="" tabindex="5000" data-display-id="Schedule-00-Row136153aa-9fa8-499b-8458-2b155443223bE-TaskId-Display">
   <option value=""></option>
   <option value="OPT1">Option 1</option>
   <option value="OPT2">Option 2</option>
   <option value="OPT3">Option 3</option>
   <option value="OPT4">Option 4</option>
   <option value="OPT5">Option 5</option>
</select>

我尝试使用此Java代码来选择选项2

WebDriverWait wait = new WebDriverWait(driver, 100);

wait.until(ExpectedConditions.visibilityOfElementLocated(By.cssSelector(".form-row.print-avoid-page-break>label")));

//Start to find the element. The ID is dynamically randomly generated by the system each time the page loads except the last part TaskID, thus looking for the string TaskID   
Select dropdown = new Select (driver.findElement(By.xpath(".//*[contains(@id,'TaskId')]"))); 

dropdown.selectByValue("OPT2");

Selenium返回错误

  

org.openqa.selenium.ElementNotVisibleException:元素不可见:元素当前不可见,可能无法操作

我觉得这是由<div class="subhidden">引起的,但我不太确定。 任何建议都非常感谢。感谢。

4 个答案:

答案 0 :(得分:4)

下面测试过的代码块看起来很好。 看html它是一个公平的假设,即选择器不会唯一地返回intendet元素。我相信您希望Select标记包含id TaskId。只需简单地使用//select[contains(@id,'TaskId')]进行与标记相关的搜索,因为<input id="Schedule-00-Row136153aa-9fa8-499b-8458-2b155443223bE-TaskId-Display"也具有相同文本TaskId的ID,并且我建议您在将其插入测试之前测试xpath ,至少根据我的经验说。

WebDriverWait wait = new WebDriverWait(driver, 100);
By selectElementSelector = By.xpath("//select[contains(@id,'TaskId')]");
WebElement selectElement = wait.until(ExpectedConditions.presenceOfElementLocated(selectElementSelector));
Select dropdown = new Select (selectElement);
dropdown.selectByValue("OPT2");

修改

另一种可能的选择是使用适当的选择器查找元素以及选项。同样,你必须测试选择器,以确保它是唯一的,这就是你想要的。

WebDriverWait wait = new WebDriverWait(driver, 100);
String optionToSelect = "OPT1";
//Selector is the trick here
By selectElementSelector = By.cssSelector("select[id*='TaskId']>option[value='" + optionToSelect + "']");

wait.until(ExpectedConditions.presenceOfElementLocated(selectElementSelector)).click();

答案 1 :(得分:1)

要单击不可见元素,请尝试使用“操作”。 首先单击 - 打开下拉列表。 下一步 - 将光标移动到元素的坐标,然后单击坐标。

Actions build = new Actions(driver);
By YourSelectItem = By.XPath("xPath to find");
By YourOptionToClick= By.XPath("xPath to find");
IWebElement el  =  driver.FindElement(YourSelectItem));
IWebElement el  =  driver.FindElement(YourOptionToClick));
build.MoveToElement(el).Click().MoveToElement(YourOptionToClick).Click().Build().Perform();

对不起C#,我不能写java模拟:)

答案 2 :(得分:0)

我的2c值得这个...

我把HTML放在一个文件中,保存为html并在FF中打开。然后我使用Selenium IDE记录下拉选择。转换为Java后,我得到了这个:

 new Select(driver.findElement(By.id("Schedule-00-Row136153aa-9fa8-499b-8458-2b155443223bE-TaskId"))).selectByVisibleText("Option 2");

我对此进行了测试,但效果很好。

答案 3 :(得分:0)

找到根本原因。我的感觉是正确的。它是由<div class="subhidden">引起的,因为它是一个隐藏元素,Selenium无法触及它。 (不确定是否有任何解决方法来处理隐藏元素)。

网页有2层。第1层是可见的下拉框,最终用户可以在其中选择值。

此第1层的HTML代码类似于

    <!-- language: lang-html -->
<input id="Schedule-00-Row831efe50-8f53-4c0f-b9b0-9b622221c62cE-TaskId-Display" class="ui-autocomplete-display validate widget" type="text" autocomplete="off">
    <div class="ui-calendar">
    <ul class="ui-autocomplete-list hidden" style="opacity: 0; visibility: hidden; top: 347px; left: 213px;">
    <li class="visible " data-value=""></li>
    <li class="visible" data-value="OPT1">Option 1</li>
    <li class="visible" data-value="OPT2">Option 2</li>
    <li class="visible" data-value="OPT3">Option 3</li>
    <li class="visible" data-value="OPT4">Option 4</li>
    <li class="visible" data-value="OPT5">Option 5</li>

后面还有另一层,看起来像这样

<!-- language: lang-html -->
<span class="ui-autocomplete-display-icon"></span>
<div class="subhidden">
<select id="Schedule-00-Row831efe50-8f53-4c0f-b9b0-9b622221c62cE-TaskId" class="validate widget " data-default-value="" tabindex="5000" data-display-id="Schedule-00-Row831efe50-8f53-4c0f-b9b0-9b622221c62cE-TaskId-Display">
<option value=""></option>
<option value="OPT1">Option 1</option>
<option value="OPT2">Option 2</option>
<option value="OPT3">Option 3</option>
<option value="OPT4">Option 4</option>
<option value="OPT5">Option 5</option>
</select>

因此,用户将从第1层的下拉框中选择值,然后将所选值传输到下拉框第2层以进行进一步处理。

我试图编码Selenium来从第2层(隐藏)的下拉框中选择值,而没有意识到还有另一个可以点击的图层。

知道根本原因后,Selenium代码就像这样

<!-- language: lang-java -->
WebElement Box = driver.findElement(By.xpath(".//*[contains(@id,'TaskId-Display')]"));
Box.click();

WebElement List = driver.findElement(By.xpath("html/body/ul[1]/li[2]"));
DivisionList.click();

总之,我强迫Selenium从隐藏的下拉列表中选择一个值。

@Saifur,谢谢你们的讨论。