如何使用selenium c#获取元素外部的文本并更改运行时间?

时间:2018-05-08 07:38:10

标签: c# selenium selenium-webdriver xpath webdriver

我有一段代码如下

<div class="span6" style="text-align:right;">
    <span class="muted" style="padding-left:20px;">Member ID: </span>MKL123451KKM
    <span class="muted" style="padding-left:20px;">Service Date: </span>05/08/2018
</div>

在上面的代码中,我希望得到值&#34; MKL123451KKM &#34;,这个值会经常变化。

我尝试过以下xpaths,这是错误的。

XPATH

  1. /html/body/div/span[1][contains(text(),'Member ID:')]/../text()

  2. /html/body/div/span[1][contains(.,'Member ID:')]/../text()

  3. 错误

    xpath表达式的结果:

    /html/body/div/span[1][contains(text(),'Member ID:')]/../text() is: [object Text]. It should be an element.
    

    注意:

    我正在使用selenium驱动程序用于IE和c#使用VS 2015 IDE

    有人可以对此有所了解吗?

4 个答案:

答案 0 :(得分:1)

根据您共享的HTML,文本 MKL123451KKM 不在任何子<span>节点内,而是在父<div>节点内。提取文本,例如 MKL123451KKM 您可以使用以下代码块:

IWebElement elem = driver.FindElement(By.XPath("//div[@class='span6']"));
string text = (string)((IJavaScriptExecutor)driver).ExecuteScript("return arguments[0].childNodes[2].textContent;", elem);

答案 1 :(得分:1)

你很亲密。创建一个从HTML标签开始或具有太多级别的定位器通常不是一个好习惯,因为它更脆弱(当页面更改时更容易破坏)。理想情况下,您可以通过文本标签找到标签元素,例如“成员ID”,然后找到以下文本节点。这种方法的最大好处是它与“会员ID”标签相关联。其他一些答案是硬编码到特定的文本节点,现在可能很好,但如果数据发生变化,它可能会返回错误的值。

您可以将此全部包装在传递标签的函数中,并返回值。

public string GetValue(string labelName)
{
    IWebElement e = Driver.FindElement(By.XPath($"//span[contains(.,'{labelName}')]"));
    string s = (string)((IJavaScriptExecutor)Driver).ExecuteScript("return arguments[0].nextSibling.textContent;", e);
    return s.Trim();
}

你会称之为

GetValue("Member ID")

答案 2 :(得分:0)

那是因为文本在div中。您需要从xpath获取文本:

//div[@class='span6']

即使这个xpath不是非常防改变的,但是如果你从中得到文本它应该可以工作。该文本将是MKL123451KKM和05/08/2018

答案 3 :(得分:0)

试试这个XPath

//div[@class='span6']/span/following-sibling::text()[1]