【问题标题】:Retrieving Text between <span>Text</span> in Selenium C#在 Selenium C# 中检索 <span>Text</span> 之间的文本
【发布时间】:2012-12-27 16:16:30
【问题描述】:

我在使用 Selenium webdriver-C# 从未读邮件中检索邮件的主题标题时遇到问题。

这是 HTML 代码:

<div class="ae4 UI UJ" gh="tl">
 <div class="Cp">
  <div>
    <table id=":8e" class="F cf zt" cellpadding="0">
    <colgroup>
    <tbody>
      <tr id=":8d" class="zA zE">
       <td class="PF xY"></td>
       <td id=":8c" class="oZ-x3 xY" style="">
       <td class="apU xY">
       <td class="WA xY">
       <td class="yX xY ">
       <td id=":87" class="xY " role="link" tabindex="0">
        <div class="xS">
         <div class="xT">
          <div id=":86" class="yi">
          <div class="y6">
          **<span id=":85">
             <b>hi</b>
            </span>**
            <span class="y2">
          </div>
         </div>
        </div>
       </td>
       <td class="yf xY "> </td>
       <td class="xW xY ">
     </tr>

我可以在控制台中打印“emailSenderName”,但无法打印“文本”(在这种情况下,主题行即“hi”),因为它位于跨度标签之间。这是我的代码。

 //Try to Retrieve mail Senders name and Subject
        IWebElement tbl_UM = d1.FindElement(By.ClassName("Cp")).FindElement(By.ClassName("F"));
        IList<IWebElement> tr_ListUM = tbl_UM.FindElements(By.ClassName("zE"));
        Console.WriteLine("NUMBER OF ROWS IN THIS TABLE = " + tr_ListUM.Count());
        foreach (IWebElement trElement in tr_ListUM)
        {
            IList<IWebElement> td_ListUM = trElement.FindElements(By.TagName("td"));
            Console.WriteLine("NUMBER OF COLUMNS=" + td_ListUM.Count());
            string emailSenderName = td_ListUM[4].FindElement(By.ClassName("yW")).FindElement(By.ClassName("zF")).GetAttribute("name");
            Console.WriteLine(emailSenderName);
            string text = td_ListUM[5].FindElement(By.ClassName("y6")).FindElement(By.TagName("span")).FindElement(By.TagName("b")).Text;
            Console.WriteLine(text);
        }

我也试过直接从第 5 列 (td) 的标签中选择文本,其中包含主题文本(在我的例子中),但没有结果。

我可能在某个地方出错了,或者可能有其他方法。

请建议,提前谢谢:)

【问题讨论】:

    标签: c# selenium-webdriver html


    【解决方案1】:

    Selenium Web Driver 的 Java 实现中可用的“getText”方法似乎比 C# 中可用的等效“Text”属性做得更好。

    我找到了一种达到相同目的的方法,虽然有些复杂,但效果很好:

    public static string GetInnerHtml(this IWebElement element)
    {
        var remoteWebDriver = (RemoteWebElement)element;
        var javaScriptExecutor = (IJavaScriptExecutor) remoteWebDriver.WrappedDriver;
        var innerHtml = javaScriptExecutor.ExecuteScript("return arguments[0].innerHTML;", element).ToString();
    
        return innerHtml;
    }
    

    它通过将 IWebElement 作为参数传递给在浏览器中执行的某些 JavaScript 来工作,浏览器将其视为普通 DOM 元素。然后,您可以访问其上的属性,例如“innerHTML”。

    我只在 Google Chrome 中对此进行了测试,但我看不出它为什么不能在其他浏览器中运行。

    【讨论】:

    • 这对我来说非常有效。这篇文章也提供了更多讨论:stackoverflow.com/questions/16687715/…。在我的例子中,该元素是不可见的,所以 Text 总是返回一个空字符串。 @Holf 的代码 sn-p 也适用于隐藏元素。
    • 在使用本地 chrome 驱动程序而不是远程驱动程序时是否有效?通常我必须传入当前的驱动程序。
    • 非常聪明,谢谢!
    【解决方案2】:

    使用GetAttribute("textContent") 而不是Text() 对我有用。

    Driver.FindElement(By.CssSelector("ul.list span")).GetAttribute("textContent")
    

    【讨论】:

      【解决方案3】:

      试试这个

      findElement(By.cssSelector("div.y6>span>b")).getText();
      

      【讨论】:

      • 感谢您的帮助,但它也不起作用。此外,getText() 方法不存在:(
      • 我尝试在调试模式下运行。但是,文本属性字段返回 Nothing (" ")。
      • 我尝试使用与 java 相同的 html 代码,它给出了 hi 作为输出。 System.out.println(driver.findElement(By.cssSelector("div.y6>span>b")).getText());
      • 根据原始问题,这个答案在 C# 世界中根本行不通。
      • @Holf :我不知道 C# selenium 绑定。我刚刚发布了这个答案,以提供一些关于 C# 中可能以不同名称提供的定位器和方法的想法。
      【解决方案4】:

      我遇到了同样的问题。在 PhantomJS 上工作。解决方法是使用 GetAttribute("textContent") 获取值:

      Driver.FindElementsByXPath("SomexPath").GetAttribute("textContent");
      

      【讨论】:

        【解决方案5】:

        可能为时已晚,但可能对某人有所帮助。

                IWebElement spanText= driver.FindElement(By.XPath("//span[contains(text(), 'TEXT TO LOOK FOR')]"));
                spanText.Click();
        
        
                IWebElement spanParent= driver.FindElement(By.XPath("//span[contains(text(), 'TEXT TO LOOK FOR')]/ancestor::li"));
                spanParent.FindElement(By.XPath(".//a[contains(text(), 'SIBLING LINK TEXT')]")).Click();
        

        奖励内容在这里寻找该文本的兄弟姐妹 找到 span 元素后,从父元素开始查找兄弟元素。我在这里寻找一个锚链接。 XPath 开头的点表示您从元素 spanParent 开始查找

        <li>
        <span> TEXT TO LOOK FOR </span>
        <a>SIBLING LINK TEXT</a>
        </li>
        

        【讨论】:

        • 传奇!干杯,正是我想要的。
        【解决方案6】:

        这在 Visual Studio 2017 单元测试项目中对我有用。我正在尝试从 typeahead 控件中查找搜索结果。

            IWebElement searchBox = this.WebDriver.FindElement(By.Id("searchEntry"));
        searchBox.SendKeys(searchPhrase);
        System.Threading.Thread.Sleep(3000);
        
        IList<IWebElement> results = this.WebDriver.FindElements(By.CssSelector(".tt-suggestion.tt-selectable"));
        if (results.Count > 1)
        {
        
            searchResult = results[1].FindElement(By.TagName("span")).GetAttribute("textContent");
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2018-09-04
          • 2016-05-09
          • 1970-01-01
          • 2012-04-18
          • 1970-01-01
          • 2022-07-11
          • 2014-04-04
          • 1970-01-01
          相关资源
          最近更新 更多