Próbuję kliknąć przycisk śledzenia na stronie spotify z selenem, ale to nie zadziała. Próbowałem xpath i class_name, ale nie działa.

Strona, na której próbuję kliknąć przycisk obserwuj, to strona

Element HTML:

<button type="button" class="aAr9nYtPsG7P2LRzciXc">Follow</button>

Myślę, że spotify losuje nazwy klas, aby zapobiec złomowaniu

Mój kod:

driver.find_element(By.XPATH, '//*[@id="main"]/div/div[2]/div[3]/main/div[2]/div[2]/div/div/div[2]/section/div/div[3]/div/button[1]').click()
1
jack12 24 styczeń 2022, 17:44
Do jakiego elementu próbujesz uzyskać dostęp, na jakiej dokładnie stronie?
 – 
Prophet
24 styczeń 2022, 17:47
To przycisk „obserwuj” na tej stronie => open. .com/użytkownik/…
 – 
PSR
24 styczeń 2022, 17:48
Jak to zgadłeś?
 – 
Prophet
24 styczeń 2022, 17:54
1
"", z tego rozumiem jego przycisk o nazwie "Obserwuj", a OP również połączył tę stronę. @Prorok
 – 
PSR
24 styczeń 2022, 17:57

4 odpowiedzi

Najlepsza odpowiedź

Wygląda na to, że po prostu brakuje Ci opóźnienia.
Najlepszym sposobem na to jest użycie jawnego oczekiwania na Oczekiwane warunki.
Również Twój lokalizator może zostać ulepszony.
Z następującymi portami

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

Po utworzeniu instancji obiektu wait za pomocą

wait = WebDriverWait(driver, 20)

Twoje kliknięcie może być wykonane za pomocą:

wait.until(EC.visibility_of_element_located((By.XPATH, "//button[text()='Follow']"))).click()
0
Prophet 24 styczeń 2022, 17:53
Omg zadziałało, wielkie dzięki. Próbuję to naprawić od 3 dni!!
 – 
jack12
24 styczeń 2022, 18:04
Cieszę się, że mogłem Ci pomóc
 – 
Prophet
24 styczeń 2022, 18:13

Twój kod jest w porządku.

Ale z mojego doświadczenia związanego z „niepobraniem elementu ze strony” problem polegał na tym, że nie wait enough nie załadowałem strony.

Spróbuj tego:

from time import sleep

sleep(0.5) # or 1 second if its slower to load
driver.find_element(By.XPATH, '//*[@id="main"]/div/div[2]/div[3]/main/div[2]/div[2]/div/div/div[2]/section/div/div[3]/div/button[1]').click()

Nie musisz czekać 20 sekund, lol.

Potrzebujesz tylko kilku sekund przed tym elementem.

0
alexzander 24 styczeń 2022, 17:54

Zamiast używać XPATH, możesz użyć cssSelector, który jest znacznie prostszy i bezpośredni

driver.implicitly_wait(20)
button = driver.find_element_by_css_selector("button[class=aAr9nYtPsG7P2LRzciXc]")
button.click()

Edycja: ponieważ wszyscy wspomnieli o czekaniu, dodałem niejawne czekanie

Uwaga: nie, sterownik nie będzie czekał 20 sekund, ale wykona się natychmiast po znalezieniu elementu. 20 sekund to maksymalny czas wyszukiwania przycisku.

0
CherrieP 24 styczeń 2022, 17:58

Element Follow jest elementem dynamicznym.

Aby kliknąć element, musisz wywołać WebDriverWait dla element_to_be_clickable () i możesz użyć jednego z następujących Strategie lokalizatora:

  • Używając CSS_SELECTOR:

    WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.CSS_SELECTOR, "div[data-testid='action-bar-row'] > button:not(aria-label)"))).click()
    
  • Używając XPATH :

    WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//button[text()='Follow']"))).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
undetected Selenium 24 styczeń 2022, 18:18