Python - Selenium Webdriver находит элемент, в котором все узлы div имеют одинаковые имена - PullRequest
1 голос
/ 24 марта 2020

Я пытаюсь получить доступ к div, где все div имеют одинаковое имя. Позволь мне объяснить. Я только начинаю с селена и python, и я пытаюсь почистить веб-страницу, чтобы узнать. Я столкнулся со следующей проблемой. Я сделал пример html, чтобы показать наращивание веб-страницы. Все div имеют одинаковый класс и заголовок. Затем есть тег h1 для элемента и тег p для цвета (это ссылка, которую можно кликнуть). Я пытаюсь найти страницу, когда вы даете ей определенные инструкции. Пример: я ищу белый гоночный мотоцикл. Я могу найти велосипеды с первой строкой кода, но как мне найти нужный цвет в разделе гоночных велосипедов? Если я запускаю Python, упомянутый ниже, я получаю сообщение об ошибке. Заранее спасибо!

<!DOCTYPE html>
<html>
    <body>
        <div class=div title=example>
            <h1>racebike</h1>
            <p class='test'>black</p>
        </div>
        <div class=div title=example>
            <h1>racebike</h1>
            <p class='test'>white</p>
        </div>
        <div class=div title=example>
            <h1>racebike</h1>
            <p class='test'>yellow</p>
        </div>
        <div class=div title=example>
            <h1>citybike</h1>
            <p class='test'>yellow</p>
        </div>
        <div class=div title=example>
            <h1>citybike</h1>
            <p class='test'>green</p>
        </div>
    </body>
</html>

test = (self.driver.find_element_by_xpath("//*[contains(text(), racebike)]"))
test.self.driver.find_element_by_xpath(".//*[contains(text(), white)]").click

Ответы [ 2 ]

0 голосов
/ 24 марта 2020

Вы можете использовать тот же xpath, который вы использовали в своем решении. Возможно, сервер слишком долго не отвечает.

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

element = WebDriverWait(page, 10).until(EC.presence_of_element_located((By.XPATH, "//p[contains(@class, 'white')]")))
element.click()

для нескольких велосипедов с белым цветом

elements= WebDriverWait(driver, 30).until(EC.presence_of_all_elements_located((By.XPATH, "//p[contains(@class, 'white')]")))
for element in elements:
    element.click()
0 голосов
/ 24 марта 2020

Чтобы найти / click() на элементе white racebike , вам нужно вызвать WebDriverWait для element_to_be_clickable(), и вы можете использовать любой из следующих на основе Стратегии локатора :

  • Использование XPATH:

    WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//h1[text()='racebike']//following-sibling::p[@class='test' and text()='white']"))).click()
    
  • Использование XPATH с учетом родителя <div>:

    WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//div[@class='div' and @title='example']/h1[text()='racebike']//following-sibling::p[@class='test' and text()='white']"))).click()
    
  • Примечание : Вы должны добавить следующие импорта:

    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.common.by import By
    from selenium.webdriver.support import expected_conditions as EC
    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...