Próbuję uzyskać dostęp do elementu div, w którym wszystkie elementy div mają taką samą nazwę. Pozwól mi wyjaśnić. Właśnie zaczynam od selenu i Pythona i próbuję zeskrobać stronę internetową, aby się nauczyć. Napotkałem następujący problem. Zrobiłem przykład html, aby pokazać tworzenie strony internetowej. Wszystkie elementy DIV mają dokładnie tę samą klasę i tytuł. Następnie znajduje się znacznik h1 dla elementu i znacznik p dla koloru (który jest klikalnym linkiem). Próbuję przeszukać stronę, gdy dajesz jej określone instrukcje. Przykład: Szukam białego roweru wyścigowego. Jestem w stanie znaleźć rowery z pierwszą linijką kodu, ale jak znaleźć właściwy kolor w sekcji rowerów wyścigowych? Jeśli uruchomię wspomniany poniżej Python, pojawi się komunikat o błędzie. Z góry dziękuję!

<!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
1
Thijs 24 marzec 2020, 00:50

2 odpowiedzi

Najlepsza odpowiedź

Aby zlokalizować / click() na elemencie white racebike , musisz wywołać WebDriverWait dla element_to_be_clickable() i możesz użyć jednej z poniższych na podstawie Strategie dotyczące lokalizacji:

  • Korzystanie z XPATH:

    WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//h1[text()='racebike']//following-sibling::p[@class='test' and text()='white']"))).click()
    
  • Używanie XPATH z uwzględnieniem rodzica <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()
    
  • Uwaga : musisz dodać następujące importy:

    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.common.by import By
    from selenium.webdriver.support import expected_conditions as EC
    
0
DebanjanB 23 marzec 2020, 22:02

Możesz użyć tej samej ścieżki xpath, którą wypróbowałeś w swoim rozwiązaniu. Możliwe, że odpowiedź serwera trwa zbyt długo.

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()

dla wielu rowerów w kolorze białym

elements= WebDriverWait(driver, 30).until(EC.presence_of_all_elements_located((By.XPATH, "//p[contains(@class, 'white')]")))
for element in elements:
    element.click()
0
Dipak Bachhav 25 marzec 2020, 18:57