Как получить [текст объекта] через XPath? - PullRequest
2 голосов
/ 26 сентября 2019

Я работаю над селеном и пытаюсь получить доступ к тексту из узла, но я не уверен, как извлечь и утверждать текст с утвержденным ключевым словом.

Это узел -

<div class="Notification-body">
    <div class="">
        <div class="type--primary u-textBreak">
            <span class="u-inline">
                <span class="type--title">User Name</span> approved "Page_For_Submission"
            </span>
        </div>
        <span class="u-displayBlock type--note">4 hours ago</span>
    </div>
</div>

Изначально я пробовал этот XPath, но он не дает результата -

(//span[contains(@class,'title')]/following-sibling::text()[contains(text(),'approved')])[1]

означает, что это не простой текстовый узел.

Позже я использовал следующие XPath и смог определить положениеэлемента

(//html/body/div[7]/div[3]/div[2]/div/div/div/div/ul/li[2]/a/div/div/div/div/span/text())[2]
//span[contains(@class,'title')]/following-sibling::text()
(//span[contains(@class,'title')]/following-sibling::text()[contains(.,'approved')])[1]

Но при использовании этих XPath-ов в селене

System.out.println(driver.findElement(By.xpath(prop.getProperty("txt_approvedNotification"))).getText());

Получение следующей ошибки при выполнении

org.openqa.selenium.InvalidSelectorException: invalid selector: The result of the xpath expression "(XPath of Element)[2]" is: [object Text]. It should be an element.
  (Session info: chrome=77.0.3865.90)
Build info: version: '3.11.0', revision: 'e59cfb3', time: '2018-03-11T20:26:55.152Z'
System info: host: '*****', ip: '*****', os.name: 'Windows 10', os.arch: 'amd64', os.version: '10.0', java.version: '1.8.0_191'

Driver info: org.openqa.selenium.chrome.ChromeDriver
Capabilities {acceptInsecureCerts: false, browserName: chrome, browserVersion: 77.0.3865.90,

Просто хочучтобы узнать, является ли его проблема XPath или ограничение селена драйвер.

Ответы [ 2 ]

1 голос
/ 26 сентября 2019

Selenium не может обернуть отдельный текстовый узел в WebElement.Таким образом, вы можете подготовить и выполнить код JavaScript, который найдет нужный вам текстовый узел, оберните его в тег и добавьте в DOM с уникальным идентификатором.Тогда вы сможете получить этот элемент с помощью Selenium (findElement(By.id())).

Найдите некоторые детали здесь https://sqa.stackexchange.com/a/33097/27679

0 голосов
/ 26 сентября 2019

Я знаю, что вы уже приняли ответ, но есть гораздо более простая альтернатива.Просто возьмите родительский элемент и подтвердите, что «утверждено» содержится в содержащемся тексте.Вы не поместили тег кода, поэтому приведенный ниже пример кода написан на C # и использует NUnit для подтверждения.Возможно, вам придется настроить локатор, если он не находит элемент уникальным образом, но код ниже демонстрирует основную концепцию утверждения, что конкретная строка находится внутри определенного элемента.

StringAssert.Contains("approved", driver.FindElement(By.CssSelector("span.u-inline")).Text, "Verify that X was 'approved'.");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...