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

时间:2014-08-28 15:09:41

标签: c# jquery selenium selenium-webdriver automated-tests

我正在使用 Selenuim Webdriver C#中编写自动化测试脚本,我需要逐个点击两个下拉列表。以下是两个下拉元素的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> 

我能够通过CssSelector在第一个下拉列表(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();  

我认为此插件已用于创建下拉列表:jQuery plugin

有人可以帮我找到办法吗?

修改
这两个元素设置为display:none,因此当我尝试使用driver.FindElement(By.Id("ServiceTypeId")).Click();点击它们时,我收到错误:

  

元素目前不可见,因此可能无法与

进行交互

3 个答案:

答案 0 :(得分:0)

尝试使用css3伪选择器

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

答案 1 :(得分:0)

这些下拉列表的创建方式并不重要,我认为选择器的问题。顺便说一句,如果将来你想从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();

答案 2 :(得分:0)

我找到了解决方案并希望分享,因为它可能会帮助其他人面临类似的问题 主要问题是元素设置为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);

感谢。