【问题标题】:How to get lookup list item using Selenium 2.0 with C#如何使用 Selenium 2.0 和 C# 获取查找列表项
【发布时间】:2015-06-08 09:38:37
【问题描述】:

我试图从查找列表中选择一个项目,它不像下拉列表。如果您编写的内容与查找列表的内容相匹配,则所有匹配的内容都会显示在列表中,即使您知道查找列表中的项目,您也不能简单地在文本字段中输入,您必须单击查找列表中的项目列表以使其填充到文本字段中。 我所做的是,我在字段中写入有效字段值的完整文本,以便它是出现在查找列表中的唯一项目,然后尝试搜索该列表项以便可以单击它,但无论我尝试什么,找不到该项目。这是我已经尝试过的: 这是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();

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

【问题讨论】:

    标签: c# firefox xpath selenium-webdriver css-selectors


    【解决方案1】:

    为了从查找列表中键入/选择和项目,您应该首先单击包含 ul/li 项目的父项。当你点击它的父级时,与 ul/li (display: none) 关联的样式将被移除,这样你就可以与 ul/li 交互了。

    从发布的 HTML 中,我们可以观察到 UL 有一个带有属性 display: none 的样式,这意味着我们不能与它或它的子级交互。如果您发布完整的 HTML/网站 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;
                }
            } 
        }
    }
    

    }

    尝试观察已发布门户的 HTML。上述解决方案可以很好地选择查找项。

    【讨论】:

    • 感谢 Sham 提供如此详细的回答。这很有帮助。当我输入一个项目的文本并在下拉列表中加载可能的匹配项时,html 中会出现一个文本“xx 结果可用”,xx 是匹配项数。我使用了这个 if 条件,如果(item.Text.Contains(“结果可用”))。它现在可以工作了。
    【解决方案2】:

    索菲亚,

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

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

    一旦确定了这一点,您就可以真正仔细查看通用结构(显然使用ui-id-27 仅用于此测试)。然后,我将继续查看真实案例中的 XPath 结构,并在呈现的 Id 和通用 Xpath 元素之间建立测试。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-08-02
      • 2020-11-17
      • 2015-11-20
      • 2019-02-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多