我在使用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)的标签中选择Text,其中包含主题文本(在我的例子中),但没有结果。
我可能在某处出错或者可能有其他方法可以做到。
请建议,提前致谢:)
答案 0 :(得分:6)
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'。
我只是在谷歌浏览器中对此进行了测试,但我认为没有理由认为这不适用于其他浏览器。
答案 1 :(得分:4)
使用GetAttribute("textContent")
代替Text()
为我做了诀窍。
Driver.FindElement(By.CssSelector("ul.list span")).GetAttribute("textContent")
答案 2 :(得分:1)
试试这个
findElement(By.cssSelector("div.y6>span>b")).getText();
答案 3 :(得分:1)
我遇到了同样的问题。致力于PhantomJS。解决方案是使用GetAttribute获取值(&#34; textContent&#34;):
Driver.FindElementsByXPath("SomexPath").GetAttribute("textContent");
答案 4 :(得分:0)
这在Visual Studio 2017单元测试项目中为我工作。我正在尝试从预输入控件中找到搜索结果。
using seconds = std::chrono::seconds; //std::duration<int64_t, std::ratio<1,1>>
using milliseconds = std::chrono::milliseconds; //std::duration<int64_t, std::ratio<1,1000>>
using nanoseconds = std::chrono::nanoseconds; //std::duration<int64_t, std::ratio<1,1000000000>>
seconds time1 = 5s; //underlying integer value is 5.
milliseconds time2 = 5ms; //underlying integer value is 5.
time2 = time1; //underlying integer value for time2 is 5000, for time1 is still 5.
time2 = 17ms; //underlying integer value is 17.
//time1 = time2; //forbidden; tick size of time2 is smaller than time1
time1 = std::chrono::duration_cast<seconds>(time2);
//underlying integer value for time1 is 0, due to truncation; time2 is still 17.
nanoseconds time3 = 5ms; //underlying integer value is 5000000.
time1 = 2s; //underlying integer value is 2.
time3 = time1; //underlying integer value is 2000000000.
答案 5 :(得分:0)
可能为时已晚,但可能对某人有所帮助。
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>