Как получить текст, который находится за пределами элемента и изменения во время выполнения, используя селен c #? - PullRequest
0 голосов
/ 08 мая 2018

У меня есть кусок кода, как показано ниже

<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>

в приведенном выше коде я хочу получить значение " MKL123451KKM ", это значение будет часто меняться.

Я пытался использовать ниже xpaths, который выдавал ошибку.

XPATH :

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

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

ОШИБКА :

Результат выражения xpath:

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

Примечание:

я использую драйвер селена для IE и c # с IDE VS 2015

Кто-нибудь может пролить свет на это?

Ответы [ 4 ]

0 голосов
/ 08 мая 2018

Вы были довольно близко. Как правило, не рекомендуется создавать локатор, который начинается с тега HTML или имеет слишком много уровней, потому что он более хрупкий (с большей вероятностью ломается при изменении страницы). В идеале вы найдете элемент label по текстовой метке, например, «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")
0 голосов
/ 08 мая 2018

В соответствии с 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);
0 голосов
/ 08 мая 2018

Попробуйте этот XPath

//div[@class='span6']/span/following-sibling::text()[1]
0 голосов
/ 08 мая 2018

Это потому, что текст внутри div. Вам нужно будет получить текст из xpath:

//div[@class='span6']

Несмотря на то, что этот xpath не очень защищен от изменений, он должен работать, если вы получаете текст из него. Текст будет MKL123451KKM и 05/08/2018

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...