【问题标题】:Using Selenium (C#) Select an item from a drop down by text使用 Selenium (C#) 从文本下拉列表中选择一个项目
【发布时间】:2015-05-16 02:09:37
【问题描述】:

我一直在努力解决这个问题,并且可以在这里获得 Selenium 专家的帮助。我的页面上有一个下拉列表,我正在尝试从测试中选择一个选项,但我似乎无法做到这一点。 我已经尝试了以下我经常看到的用于选择项目的示例。选项始终将文本显示为空 string "" 即使我可以在 HTML 标记中看到选项文本在那里。

wait.Until(d => ExpectedConditions.ElementExists(By.Id("Cars")));
var carStatusDropDown = new SelectElement(_driver.FindElement(By.Id("Cars")));
carStatusDropDown.SelectByText(filter.CarStatus);

我认为是因为浏览器可能看不到这些选项,所以我尝试单击下拉菜单(引导程序)旁边的按钮,以便在选择文本之前将其打开

wait.Until(ElementIsClickable(By.XPath("/html/body/div[2]/div[2]/div/div[2]/div[1]/div/form/fieldset/div[3]/div/div[1]/span[2]/div/div/span")));
IWebElement ddlButton = _driver.FindElement(By.XPath("/html/body/div[2]/div[2]/div/div[2]/div[1]/div/form/fieldset/div[3]/div/div[1]/span[2]/div/div/span"));
ddlButton.Click();

wait.Until(d => ExpectedConditions.ElementExists(By.Id("Cars")));
var carStatusDropDown = new SelectElement(_driver.FindElement(By.Id("Cars")));
carStatusDropDown.SelectByText(filter.CarStatus);

我可以看到 ddlButton 打开下拉列表,但仍然出现 >OpenQA.Selenium.ElementNotVisibleException 当它尝试SelectByText 时。在VS 中,我可以看到选项文本仍然显示“”,并且 Displayed 属性对它们来说是假的。我怎样才能找到这些选项,任何反馈都将不胜感激,我在下面发布了 HTML <select> 测试代码中的一个。 firebug 中的选择项在标记中显示为淡出?!?

HTML:

<div class="combobox-container">
   <input type="hidden" name="Estimate.EstimateStatus" value=" ">
   <input type="text" autocomplete="off"  
      placeholder="All"class="combobox">
   <ul class="typeahead typeahead-long dropdown-menu" style="top:   
      112px;left: 445.117px; display: none;">
      <li data-value="Approved" class=""><a href="#"><strong>
         </strong>A<strong></strong>p<strong></strong>p<strong>
         </strong>r<strong></strong>o<strong></strong>v<strong>
         </strong>e<strong></strong>d<strong></strong></a>
      </li>
      <li data-value="Hold" class=""><a href="#"><strong>
         </strong>H<strong>
         </strong>o<strong></strong>l<strong></strong>d<strong></strong>
         </a>
      </li>
      <li data-value="In Progress"><a href="#"><strong></strong>I<strong>
         </strong>n<strong></strong> <strong></strong>P<strong>
         </strong>r<strong></strong>o<strong></strong>g<strong>
         </strong>r<strong></strong>e<strong></strong>s<strong>
         </strong>s<strong></strong></a>
      </li>
      <li data-value="Not Reviewed" class="active">
         <a href="#"><strong></strong>N<strong>
         </strong>o<strong></strong>t<strong></strong> <strong>
         </strong>R<strong></strong>e<strong></strong>v<strong>
         </strong>i<strong></strong>e<strong></strong>w<strong>
         </strong>e<strong></strong>d<strong></strong></a>
      </li>
      <li data-value="Rejected"><a href="#"><strong></strong>R<strong>
         </strong>e<strong></strong>j<strong></strong>e<strong>
         </strong>c<strong></strong>t<strong></strong>e<strong> 
         </strong>d<strong></strong></a>
      </li>
   </ul>
   <span class="add-on btn dropdown-toggle" data-dropdown="dropdown">
   <span class="caret"></span>
   <span class="combobox-clear">
   </span>
</div>
<select id="Cars" class="combobox" 
   onchange="javascript:OnCarsStatusChanged();" style="display: none;">
   <option value=" " selected="selected">All</option>
   <option value="3ad8cf29-f0b7-441f-
      81bc-c5cfe7c0d73d">Approved</option>
   <option value="19b573c8-fc88-4abe-9c19-9ffc580a1ffe">Hold</option>
   <option value="e3a8b2bd-c3eb-47c3-95e7-f15da2f3d25b">In      
      Progress
   </option>
   <option value="962e4bce-1ca5-404f-b7a0-6a3a42ad91a0">Not 
      Reviewed
   </option>
   <option value="c110e83a-5a93-4553-
      a907-02a47ca97467">Rejected</option>
</select>

【问题讨论】:

  • 能否也分享一下html?
  • 刚刚也更新了html
  • 我远不是 Bootstrap 工作原理方面的专家,但看起来实际的 &lt;select&gt; 元素是不可见的,而 JavaScript 小部件框架使用 &lt;div&gt;、&lt;input&gt;、和&lt;ul&gt;元素来模拟一个下拉列表,而幕后的JavaScript实际上设置了&lt;select&gt;元素的值。您可以通过 JavaScript 使 &lt;select&gt; 可见(绕过 Bootstrap 框架),或操作页面上实际可见的元素。

标签: c# selenium selenium-webdriver


【解决方案1】:

看起来确实有另一个动作取决于这个 dropdwon。默认情况下,此下拉列表不可见。所以,最好看看之前的操作是什么让它可见。

但是,另一种解决方法是执行一个简单的 javascript,使下拉列表可见并选择您需要的预期元素。 removeAttribute 应删除 style 属性以使列表可见。

((IJavaScriptExecutor)Driver).ExecuteScript("document.getElementById('Cars').removeAttribute('style');");

By id = By.Id('Cars');
var carStatusDropDown = new SelectElement(_driver.FindElement(id));
carStatusDropDown.SelectByText(filter.CarStatus);

【讨论】:

  • 非常感谢 Saifur ....我被困了一会儿,我使用 Javascript 删除样式元素,然后 SelectElement 能够通过文本选择...希望它有所帮助别人也是
猜你喜欢
  • 1970-01-01
  • 2011-07-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-08
相关资源
最近更新 更多