我正在使用 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();
点击它们时,我收到错误:
元素目前不可见,因此可能无法与
进行交互
答案 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);
感谢。