【问题标题】:Selenium C# dropdown list selecting valuesSelenium C# 下拉列表选择值
【发布时间】:2015-07-03 08:07:53
【问题描述】:

我在使用 C# 上的 Selenium WebDriver 填充下拉列表时遇到问题。

这是 HTML 代码:

<div class="chosen-container chosen-container-single chosen-container-single-nosearch" style="width: 278px;" title="" id="phmain_0_phcontent_4_ddlJobType_chosen">
    <a tabindex="-1" class="chosen-single">
        <span>Fabricator</span>
        <div><b></b></div>
    </a>
    <div class="chosen-drop">
    <div class="chosen-search">
        <input type="text" autocomplete="off" readonly=""></div>
        <ul class="chosen-results">
            <li class="active-result" style="" data-option-array-index="1">Fabricator</li>
            <li class="active-result" style="" data-option-array-index="2">Postformer</li>
            <li class="active-result" style="" data-option-array-index="3">Retailer</li></ul>
        </div>
    </div>

SelectElement 不能使用,因为没有&lt;select&gt; 标签。

我尝试选择&lt;li&gt; 元素的XPATH,但没有运气:

var jobTypeInput = Driver.Instance.FindElement(By.XPath("/html/body/form/div[4]/div[2]/section/div[2]/div[1]/div[3]/fieldset[1]/div[4]/div/div/ul/li[1]"));
jobTypeInput.Click();

收到此错误:

无法定位元素: {"method":"xpath","selector":"/html/body/form/div[4]/div[2]/section/div[2]/div[1]/div[3]/fieldset[ 1]/div[4]/div/div/ul/li[1]"}

关于如何用它的 3 个值之一填充下拉列表的任何想法?

【问题讨论】:

  • 您使用的是什么驱动程序? PhantomJS?
  • 这个函数看起来像是使用javascript来运行的。你不能选择 li。您可能只需将所选 li 的文本复制到输入。
  • 选择器非常脆弱,看起来像是复制粘贴的。这是第一个问题。
  • @SILENT 我正在使用 Selenium WebDriver。你能解释一下“只需复制一个选定的li的文本输入”吗?谢谢

标签: c# html selenium xpath drop-down-menu


【解决方案1】:

我无法直接回答为什么 FindElement 没有获取该元素,但我有一些建议。

这里绝对需要 Xpath 吗?使用 CSS 选择器或通过 LinkText 搜索怎么样?

我会尝试做:

Driver.Instance.FindElements(By.CssSelector(".active-result"))[1] ; 

您是否使用过 Chrome 扩展程序“Selector Gadget”?对于这样的事情来说,这非常棒。

【讨论】:

  • 感谢您的回答。我的代码出现以下错误:Cannot apply indexing with [] to an expression of type 'OpenQA.Selenium.IWebElement'
  • @EdinCenanovic 听起来您使用的是“FindElement”而不是“FindElements”
【解决方案2】:

使用后:FindElement中:

var selected = Driver.Instance.FindElement(By.XPath("/html/body/form/div[4]/div[2]/section/div[2]/div[1]/div[3]/fieldset[1]/div[4]/div/div/ul/li[2]"));
selected.Click();
和:
var selected = Driver.Instance.FindElement(By.XPath("/html/body/form/div[4]/div[2]/section/div[2]/div[1]/div[3]/fieldset[1]/div[4]/div/div/ul/li[2]"));
selected.Click();
你将永远得到:
Cannot apply indexing with [] to an expression of type 'OpenQA.Selenium.IWebElement
尝试使用:
var jobTypeInput = Driver.Instance.FindElements(By.Id("phmain_0_phcontent_4_ddlJobType_chosen"));
jobTypeInput.Click();

Thread.Sleep(3000);

var selected = Driver.Instance.FindElements(By.XPath("/html/body/form/div[4]/div[2]/section/div[2]/div[1]/div[3]/fieldset[1]/div[4]/div/div/ul/li[2]")); selected.Click();

【讨论】:

    【解决方案3】:

    我已经用下面的代码解决了这个问题:

    var jobTypeInput = Driver.Instance.FindElement(By.Id("phmain_0_phcontent_4_ddlJobType_chosen"));
    jobTypeInput.Click();
    
    Thread.Sleep(3000);
    
    var selected = Driver.Instance.FindElement(By.XPath("/html/body/form/div[4]/div[2]/section/div[2]/div[1]/div[3]/fieldset[1]/div[4]/div/div/ul/li[2]"));
    selected.Click();
    

    基本上我已经按 ID 选择下拉菜单并打开它。之后,我刚刚找到了我想要选择的项目,并通过 xPath 选择了它。

    也许不是最好的解决方案,但它对我有用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-10-13
      • 2015-05-19
      • 2014-02-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多