7

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

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

请建议,提前谢谢:)

4

6 回答 6

6

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

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

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

于 2013-04-25T09:51:25.680 回答
4

使用GetAttribute("textContent")而不是Text()为我做了诀窍。

Driver.FindElement(By.CssSelector("ul.list span")).GetAttribute("textContent")
于 2016-05-18T07:17:01.303 回答
1

试试这个

findElement(By.cssSelector("div.y6>span>b")).getText();
于 2012-12-27T17:44:06.043 回答
1

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

Driver.FindElementsByXPath("SomexPath").GetAttribute("textContent");
于 2017-02-19T10:34:42.063 回答
1

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

        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 元素,这里的奖励内容将查找此文本的兄弟姐妹,从 parent 开始查找兄弟姐妹。我在这里寻找一个锚链接。XPath 开头的点表示您从元素 spanParent 开始查找

<li>
<span> TEXT TO LOOK FOR </span>
<a>SIBLING LINK TEXT</a>
</li>
于 2018-11-07T19:56:53.357 回答
0

这在 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");
}
于 2018-09-25T21:23:07.073 回答