Selenium FindElement:
driver.FindElement(By.XPath($"//*[contains(text(), '{text}')]"));
Броски:
no such element: Unable to locate element:
{
"method":"xpath",
"selector":"//*[contains(text(), '269424ae-4d74-4a68-91e0-1603f2d674a0')]"
}
(Session info: chrome=74.0.3729.169)
(Driver info:
chromedriver=74.0.3729.6 (255758eccf3d244491b8a1317aa76e1ce10d57e9-refs/branch-heads/3729@{#29}),
platform=Linux 4.18.0-20-generic x86_64)
Но это определенно есть, и xpath действителен, потому что я могу использовать AngleSharp для анализа источника страницы драйвера с тем же xpathвыражение:
new HtmlParser()
.ParseDocument(driver.PageSource)
.SelectSingleNode($"//*[contains(text(), '{text}')]");
Целевым элементом является div, содержащий guid:
<div class="home-project-title-text"> 269424ae-4d74-4a68-91e0-1603f2d674a0 </div>
Это с
- dotnet core 2.2
- chrome webdriver
- Chrome 74
- Ubuntu 18.04
EDIT1
Интересно, что document.evaluate
в консоли браузера также не работает с этим выражением xpath,Я использую это как вспомогательную функцию для запуска xpath:
selectSingle = xpath => document.evaluate(xpath, document).iterateNext()
, а затем обнаруживаю, что это возвращает null:
> selectSingle("//*[contains(text(), '269424ae-4d74-4a68-91e0-1603f2d674a0')]")
> null
, но оно определенно есть и имеет ожидаемый текст, например, я могуиспользуйте другое выражение xpath, чтобы вручную найти и проверить его текстовое содержимое:
> selectSingle("//*[@id='app']/div/div[1]/div[3]/div/div[1]/div/div[1]/div")
.textContent
.trim()
== "269424ae-4d74-4a68-91e0-1603f2d674a0"
> true
EDIT2
Таким образом, причина была в том, что div создавался в реакции так:
React.createElement(
"div",
{className = "home-project-title-text"},
" ",
"269424ae-4d74-4a68-91e0-1603f2d674a0",
" ");
Я думаю, что это примерно означает, что у div есть три текстовых узла как дочерние (это верно?).Результат выглядит на 100% нормальным - он отлично отрисовывается, а проверка элемента с помощью devtools выглядит как один текстовый узел, а .textContent
возвращает объединенную строку.