找不到jQuery插件创建的下拉列表

本文关键字:下拉列表 创建 插件 jQuery 找不到 | 更新日期: 2023-09-27 18:19:41

我正在C#中使用Selenuim Webdriver编写自动化测试脚本,需要逐个单击两个下拉菜单。以下是两个下拉元素的HTML源代码:

<select id="ServiceTypeId" class="chosen chzn-done" tabindex="-1" name="ServiceTypeId" style="display: none;"></select>
    <div id="ServiceTypeId_chzn" class="chzn-container chzn-container-single">
        <a class="chzn-single" tabindex="-1" href="javascript:void(0)"><span>Choose an Option</span></a>
        <div class="chzn-drop"></div>
    </div>
    </div>
<select id="PropertyTypeId" class="chosen chzn-done" tabindex="-1" name="PropertyTypeId" style="display: none;"></select>
    <div id="PropertyTypeId_chzn" class="chzn-container chzn-container-single">
        <a class="chzn-single" tabindex="-1" href="javascript:void(0)"></a>
        <div class="chzn-drop"></div>
    </div> 

我能够通过CsSelector在第一个下拉列表(ServiceTypeId)中成功定位一个元素,如下所示:

driver.FindElement(By.CssSelector("div.chzn-container a.chzn-single")).Click();
Thread.Sleep(1000);
driver.FindElements(By.CssSelector("div.chzn-drop li.active-result"))[5].Click();
Thread.Sleep(500);  

但是我找不到第二个下拉列表(PropertyTypeId),因为它们都应用了相同的类。

我试着用他们的ID来定位他们,但不起作用:

driver.FindElement(By.Id("PropertyTypeId_chzn")).Click();  

我认为这个插件已经被用来创建dowpdowns:jQuery插件

有人能帮我想个办法吗?

编辑:
这两个元素被设置为display:none,因此当我试图使用driver.FindElement(By.Id("ServiceTypeId")).Click();点击它们时,我会得到错误:

元素当前不可见,因此可能无法与交互

找不到jQuery插件创建的下拉列表

尝试css3伪选择器

driver.FindElement(By.CssSelector("select:nth-of-type(1)")).Click();

这些下拉列表是如何创建的并不重要,我认为选择器有问题。顺便说一句,如果将来你想从dropDowns中选择值,不要忘记先点击dropDown,然后从中选择值。无论如何,下一个代码应该可以工作:

driver.FindElement(By.CssSelector("#ServiceTypeId"));
driver.FindElement(By.CssSelector("#PropertyTypeId"));

更新

//Click on first a link then li will appear in div. Click on 6th elem
driver.findElement(By.CssSelector("#ServiceTypeId_chzn > a")).click();
driver.findElements(By.CssSelector("#ServiceTypeId_chzn .chzn-drop > li"))[5].click();
//Same for second
driver.findElement(By.CssSelector("#PropertyTypeId_chzn > a")).click(); 
driver.findElements(By.CssSelector("#PropertyTypeId_chzn .chzn-drop > li"))[5].click();

我找到了解决方案,并希望与大家分享,因为它可能会帮助其他面临类似问题的人
主要问题是元素被设置为display:none,因此在单击它们之前,它们应该是可见的。我可以使用这样的JavaScript:

IJavaScriptExecutor js = driver as IJavaScriptExecutor;
js.ExecuteScript("document.getElementById('ServiceTypeId').style.display = '';");
Thread.Sleep(500);
driver.FindElement(By.Id("ServiceTypeId")).Click();
Thread.Sleep(300);
js.ExecuteScript("document.getElementById('PropertyTypeId').style.display = '';");
Thread.Sleep(2000);
driver.FindElement(By.Id("PropertyTypeId")).Click();
Thread.Sleep(500);

谢谢。