Как извлечь численность населения страны из en.wikipedia.org с помощью Selenium через Java - PullRequest
0 голосов
/ 28 мая 2019

Я пытаюсь извлечь численность населения / текст элемента.

Я пытался с родителем, но он показывает ошибку. Я пытаюсь получить Население Китая из этой страницы таблицы https://en.wikipedia.org/wiki/China

Пробный код:

WebElement dateBox7 = driver.findElement(By.xpath("//*[contains(text(),'Population')]/parent::tr//td/a[text()]"));

Ошибка:

Exception in thread "main" org.openqa.selenium.NoSuchElementException:

Я пробовал //*[contains(text(),'2016 estimate')]/ancestor::tr/td/text()[1] этот xpath показывает население в DOM. Но в селене он показывает ошибку:

Exception in thread "main" org.openqa.selenium.InvalidSelectorException: invalid selector: The result of the xpath expression "//*[contains(text(),'2016 estimate')]/ancestor::tr/td/text()[1]" is: [object Text]. It should be an element.

Почему это не работает?

Ответы [ 2 ]

1 голос
/ 28 мая 2019

Для извлечения Населения Китая, то есть текста 1 403 500 365 из этой таблицы страниц https://en.wikipedia.org/wiki/China, вам нужно вызвать WebDriverWait для visibilityOfElementLocated(), и так как требуемый текст находится в пределах Текстовый узел , вам нужно использовать executeScript(), и вы можете использовать следующую Стратегию локатора :

WebElement myElement = new WebDriverWait(driver, 20).until(ExpectedConditions.visibilityOfElementLocated(By.xpath("//a[text()='Population']//following::tr[1]//td"))); 
System.out.println(((JavascriptExecutor)driver).executeScript("return arguments[0].childNodes[2].textContent;", myElement).toString());

Подобное обсуждение можно найти в Как извлечь текст из элемента с помощью Selenium WebDriver и Java

1 голос
/ 28 мая 2019

Попробуйте с этим xpath

"//*[contains(.,'Population')]/parent::tr//th/a[text()]"

Обратите внимание, что есть два изменения: td -> th и [contains(text(),'Population')] -> [contains(.,'Population')].

При поиске [contains(.,'Population')] «точка» означает поиск по всему тексту внутри элемента (включая потомков), тогда как «text ()» будет искать только прямое текстурное содержимое элемента.

EDIT:

Исходя из вашего комментария, попробуйте этот xpath:

"//*[contains(.,'Population')]/parent::tr/following-sibling::tr[1]/td"

РЕДАКТИРОВАНИЕ № 2:

Об обучающей программе по локаторам Xpath см. здесь и бесплатном курсе по этой теме см. здесь .

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