如何使用带有 C# 的 Selenium 2.0 获取查找列表项

How to get lookup list item using Selenium 2.0 with C#

我正在尝试 select 查找列表中的项目,它不像下拉列表。如果您编写的内容与查找列表的内容相匹配,所有匹配的内容都会显示在列表中,即使您知道查找列表中的项目,也不能简单地在文本字段中键入,您必须单击查找中的项目列表以便它填充在文本字段中。 我正在做的是,我在字段中写入有效字段值的完整文本,以便它是唯一出现在查找列表中的项目,然后尝试搜索该列表项以便可以单击它,但无论我尝试什么,找不到该项目。这是我已经尝试过的: 这是 html:

<body>

  <div class="body-home"></div>
  <script type="text/javascript"></script>
  <script></script>
  <div id="cboxOverlay" style="display: none;"></div>
  <div id="colorbox" class="" style="display: none;"></div>
  <ul id="ui-id-1" class="ui-autocomplete ui-menu ui-widget ui-widget-content ui-corner-all" tabindex="0" style="z-index: 1; display: none; top: 456.783px; left: 468.033px; width: 247px;">

    <li class="ui-menu-item" role="presentation">
      <a id="ui-id-27" class="ui-corner-all" tabindex="-1">
        <span style="padding:10px;"></span>
      </a>
    </li>

上面html 中的最后一个标签是我要获取的标签。

这是我试过的 xpath,我也试过 cssSelecter,但没有任何效果。

IWebElement selectItem = driverX.FindElement(By.XPath("/ul[@id='ui-id-1']/li[1]/a"));
selectItem.Click();

非常感谢任何帮助。 索菲亚

索菲亚,

也许你应该首先尝试最直接的测试,即通过一个已知的 Id 来查看它是否有效:

IWebElement selectItem = driverX.FindElement(By.Id("ui-id-27"));
selectItem.Click();

一旦你建立了这个,那么你就可以真正仔细地观察通用结构(显然使用 ui-id-27 只是为了这个测试)。然后,我将继续查看真实案例中的 XPath 结构,并在提供的 Id 和通用 Xpath 元素之间建立测试。

为了 type/select 和查找列表中的项目,您应该首先单击包含 ul/li 项目的父项。当您点击它的父级时,与 ul/li 关联的样式(显示:none)将被删除,以便您可以与 ul/li.

进行交互

从 HTML posted 中,我们可以观察到 UL 具有属性显示的样式:none,这意味着我们无法与其或其子项交互.如果您 post 完整 HTML/the 网站 url,我们可以找到解决方案。

例如,查看 this 网站,它有类似的查询列表,下面是解决方案。

using System;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using OpenQA.Selenium.Chrome;
using OpenQA.Selenium;

namespace TestSelenium
{
[TestClass]
public class UnitTest1
{
    public ChromeDriver browser;

    [TestMethod]
    public void TestMethod1()
    {
        try
        {
            browser = new ChromeDriver();
            browser.Navigate().GoToUrl("https://roofandfloor.com/");
            System.Threading.Thread.Sleep(5000);

            // Select City.
            IWebElement parentDiv = browser.FindElement(By.ClassName("city-dropdown-search"));
            parentDiv.Click();
            this.SelectItem("Bangalore");

            // Select Property.
            parentDiv = browser.FindElement(By.ClassName("property-type-checkboxes"));
            parentDiv.Click();
            this.SelectItem("Villa");

            // Select Bed room. Need to write separate code for this.
            parentDiv = browser.FindElement(By.ClassName("bedroom-select-container"));
            parentDiv.Click();
            System.Threading.Thread.Sleep(1500);

            IWebElement items = browser.FindElement(By.ClassName("search-bedrooms"));
            foreach (IWebElement item in items.FindElements(By.TagName("span")))
            {
                if (item.Text.Contains("1 BHK"))
                {
                    item.Click();
                    break;
                }
            } 

            // Select Max budget.
            parentDiv = browser.FindElement(By.Id("s2id_priceMax"));
            parentDiv.Click();
            this.SelectItem("5 Lakhs");

            // Select Build up area.
            parentDiv = browser.FindElement(By.Id("s2id_areaMin"));
            parentDiv.Click();
            this.SelectItem("600 Sq.ft.");

            // Select Possession.
            parentDiv = browser.FindElement(By.Id("s2id_possessionDate"));
            parentDiv.Click();
            this.SelectItem("Ready to Occupy");
        }
        catch
        { }
    }


    private void SelectItem(string itemText)
    {
        System.Threading.Thread.Sleep(1500);

        IWebElement items = browser.FindElement(By.Id("select2-drop")); 
        foreach (IWebElement item in items.FindElements(By.TagName("li")))
        {
            if (item.Text.Contains(itemText))
            {
                item.Click();
                break;
            }
        } 
    }
}

}

尝试观察 posted 门户的 HTML。上述解决方案适用于 select 查找项。