c# - 在 Selenium C# 中检索 <span>Text</span> 之间的文本

标签 c# selenium-webdriver html

我在使用 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”,但无法打印“text”(主题行,在本例中为“hi”),因为它位于 span 标签之间。这是我的代码。

 //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) 的标签中选择文本,其中包含主题文本(在我的例子中),但没有结果。

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

请建议,提前致谢:)

最佳答案

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 中对此进行了测试,但我看不出为什么这在其他浏览器中不起作用。

关于c# - 在 Selenium C# 中检索 <span>Text</span> 之间的文本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14057699/

相关文章:

c# - 使用 LINQ 和 HtmlAgilityPack 解析 html 表

java - 无法执行 Selenium 异步脚本

javascript - 获取鼠标点击位置

html - 如何在 iOS 上将格式不正确的 html 转换为 xhtml

c# - 在 C# Linq 查询中丢弃

c# - 在 Winform 应用程序的 DataGridview 中隐藏底部的额外行

c# - ToolStripButton:以编程方式分配图像有什么问题

selenium-webdriver - Selenium 独立服务器 2.45 ;火狐版本 36

带有撇号的 JavascriptExecutor XPath

java - 如何在 Thymeleaf HTML 上使用 Java get 函数?