Найти элемент только по части его XPath с помощью Selenium - PullRequest
0 голосов
/ 23 января 2020

Я пытаюсь найти элементы с изменяющимися XPath, но только одна часть остается неизменной:

//*[@id="foo"]div[2]/div[1]/time
//*[@id="bar"]div/div[2]/div[1]/time
//*[@id="bat"]div[1]div[2]/div[1]/time

Я уже пытался использовать driver.find_element_by_xpath("//*[contains(text(), '/div[2]/div[1]/time')]"), но, похоже, это не работает.

Вот пример HTML:

<div class="entry-container">
<div class="entry-head">
<h3> some text </h3>
<time class="timestamp" datetime="2020-01-23 08:04:32 UTC">
Today at 18:34
</time>
</div>
</div>

Я хочу получить текст из элемента time.

Ответы [ 4 ]

0 голосов
/ 23 января 2020

Для обработки динамического c элемента вызовите WebDriverWait () и visibility_of_element_located () и следующие опции xpath.

XPath1 :

print(WebDriverWait(driver,10).until(EC.visibility_of_element_located((By.XPATH,"//h3[contains(.,'some text')]/following-sibling::time[1]"))).text)

XPath2 :

print(WebDriverWait(driver,10).until(EC.visibility_of_element_located((By.XPATH,"//h3[contains(.,'some text')]/following::time[1]"))).text)

XPath3 :

print(WebDriverWait(driver,10).until(EC.visibility_of_element_located((By.XPATH,"//div[@class='entry-head']//h3[contains(.,'some text')]/following-sibling::time[1]"))).text)

Вам необходимо добавить следующие библиотеки.

from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
0 голосов
/ 23 января 2020

Попробуйте этот локатор пути x:

.//div[@class]/time
0 голосов
/ 23 января 2020

попробуйте с приведенным ниже кодом, используя Xpath и CSS с ожиданием веб-драйвера, поэтому элемент будет загружен в DOM

Импорт:

from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

Xpath -1

element = WebDriverWait(driver, 20).until(
EC.element_to_be_clickable((By.XPATH, "(//time[@class='timestamp'])[1]")))

ИЛИ

Xpath -2

element = WebDriverWait(driver, 20).until(
EC.element_to_be_clickable((By.XPATH, "(//time)[1]")))

По CSS

element = WebDriverWait(driver, 20).until(
EC.element_to_be_clickable((By.CSS_SELECTOR , "time.timestamp")))
0 голосов
/ 23 января 2020

Следующее выражение XPath:

//div/div//time

даст вам все элементы time в любом месте с двумя div элементами в качестве предка. Это работает для приведенных вами примеров путей.

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