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()
4 odpowiedzi
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()
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.
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.
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
Podobne pytania
Powiązane pytania
Nowe pytania
python
Python to wielozadaniowy, wielozadaniowy język programowania dynamicznie typowany. Został zaprojektowany tak, aby był szybki do nauczenia się, zrozumienia i użycia oraz wymuszania czystej i jednolitej składni. Należy pamiętać, że Python 2 oficjalnie nie jest obsługiwany od 01-01-2020. Mimo to, w przypadku pytań Pythona specyficznych dla wersji, dodaj znacznik [python-2.7] lub [python-3.x]. Korzystając z wariantu Pythona (np. Jython, PyPy) lub biblioteki (np. Pandas i NumPy), należy umieścić go w tagach.