【问题标题】:Selenium: Element is not visible when trying to select option in drop-down list?Selenium:尝试在下拉列表中选择选项时元素不可见?
【发布时间】:2015-07-20 06:32:41
【问题描述】:

如何在如下下拉列表中选择项目Option 3

<span class="k-widget k-dropdown k-header form-control required" style="padding: 0px;" unselectable="on" role="listbox" aria-haspopup="true" aria-expanded="true" tabindex="0" aria-owns="assignee_listbox" aria-disabled="false" aria-readonly="false" aria-busy="false" aria-activedescendant="assignee_option_selected">
    <span class="k-dropdown-wrap k-state-default" unselectable="on">
	<select id="assignee" class="form-control required" style="padding: 0px; display: none;" name="assignedUserId" data-role="dropdownlist" title="">
		<option value="28941">Option 1</option>
		<option value="28938">Option 2</option>
		<option value="28940">Option 3</option>
		<option value="28942">Option 4</option>
		<option value="28943" selected="selected">Option 5</option>
		<option value="28939">Option 6</option>
	</select>
    </span>
</span>

我尝试在下拉列表中选择选项 3,下面是我的代码:

public Page selectAsignee(String asignee){
        try{
            WebElement dropdownAsignee = connector.waitForControl(SBConstant.XPATH,dropdownAssignee,3);
            // My xPath is //select[@id='assignee']
            Select select = new Select(dropdownAsignee);
            select.selectByVisibleText("Option 3");
            return this;

        }catch (StaleElementReferenceException s){
            s.toString();
        }
        return this;
    }

但它无法选择选项 3,尽管 Web 驱动程序可以检测到 id ="assignee" 的选择。 运行此代码后,它会抛出如下错误:

org.openqa.selenium.ElementNotVisibleException: 元素不是 当前可见,因此可能无法与之交互

我希望有人能指出我的错误,让这一切变得更好。

【问题讨论】:

  • 问题在于您的 style-display 属性设置为“none”,您需要进一步调查如何“显示”您的选项 -> 查看我的答案

标签: selenium selenium-webdriver


【解决方案1】:

你已经做得很好了,

但是

问题在于您的 style-display 属性设置为“none”

style="padding: 0px; display: none;"

没有显示意味着没有任何东西对 Selenium “可见”,因此您会得到 ElementNotVisibleException。

你可以尝试什么

1)

从您的 span 元素的类(k-dropdown、k-dropdown-wrap 等)来看,下拉菜单有可能被其他元素“操作”。如果您发现还包含有关您的选项的信息的 div 或列表元素,则可以检查您的站点。 比如:

<ul class="someClass" someOtherAttributes>
    <li>
        <a href="someHypertextRef">Option 1</a>
    </li>
    <li>
        <a href="someHypertextRef">Option 2</a>
    </li>
    <li>
        <a href="someHypertextRef">Option 3</a>
    </li>
</ul>

然后您将需要使用这些其他元素。我见过这种选择元素,它们的显示属性从未改变过几次。

2)

下拉菜单附近有“按钮”吗?或者您可以单击下拉菜单本身吗?如果是,请执行此操作,并检查显示属性是否更改。 如果它确实更改为“阻止”或类似的东西,您只需在尝试找到该选项之前单击下拉元素即可。

【讨论】:

  • 是的,谢谢您的解释。自己点击下拉列表后,就可以正常使用下拉列表了。
  • 如果你喜欢,你可以把它标记为正确答案然后;-)
【解决方案2】:

用这个替换你的代码,我希望它对你有用。 更新:请等待元素可见性,如果任何点击或事件使其可见或通过以下代码使其可见

 //Use JavascriptExecutor to make the element visible  
((JavascriptExecutor)wd).executeScript("jQuery('#assignee').css('display','block')");
     Select select = new Select(wd.findElement(By.xpath(".//select[@id='assignee']")));
     select.selectByVisibleText("Option 3");

【讨论】:

  • 你的代码和我的有什么区别?我试了,还是不能selectVisibleText。
  • 哦,对不起,我没有注意到 css,你正在应用样式显示无,这是问题所在。
  • 不,他没有“应用”显示样式。但这确实是问题所在(请参阅我的回答)。他必须进一步调查该站点,以找到一种方法使当前选项元素可见或找到用户使用下拉菜单时将使用的其他元素。
  • @JuhiSaxena 正如您所建议的那样,注入所需的状态/行为绝对是一种方法。虽然我个人总是尽量接近用户可以手动使用浏览器,但那是因为我主要出于 e2e 测试目的而自动化
  • @drkthng 我完全同意你的看法,但有时我们做一些事情只是为了我们的目的,所以如果是这种情况,那么他可以使用我的方法,但如果不是,他应该从最后自动化它用户流。
【解决方案3】:

试试这样:

  WebElement element = driver.findElement(By.xpath("//span[@class='kdropdown-wrap k-state-default']/select"));
  Select select = new Select(element);
  select.selectByVisibleText("Option 3");

【讨论】:

  • 对不起,即使我使用你的方式,驱动程序可以检测到选择,但无法通过可见文本选择。
  • 您可以通过传递指定的索引来使用 select.selectByIndex(index)。或使用 select.selectByValue("28941");
【解决方案4】:

SelectElement select1 = new SelectElement(driver.FindElement(By.TagName("select"))); select1.SelectByText("28940");

试试这个

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-30
    • 1970-01-01
    • 1970-01-01
    • 2013-12-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多