Je suis nouveau avec le sélénium et je suis juste en train d'explorer. J'essayais de rechercher un mot-clé sur youtube en utilisant Selenium en python. Et j'ai rencontré des erreurs.
C'est le code
C:\Users\aksch\AppData\Local\Programs\Python\Python38-32\python.exe C:/Users/aksch/PycharmProjects/pythonProject/main.py Traceback (most recent call last): File "C:/Users/aksch/PycharmProjects/pythonProject/main.py", line 13, in <module> WebDriverWait(driver, 5).until(EC.presence_of_element_located(searchBox)) File "C:\Users\aksch\AppData\Local\Programs\Python\Python38-32\lib\site-packages\selenium\webdriver\support\wait.py", line 71, in until value = method(self._driver) File "C:\Users\aksch\AppData\Local\Programs\Python\Python38-32\lib\site-packages\selenium\webdriver\support\expected_conditions.py", line 64, in __call__ return _find_element(driver, self.locator) File "C:\Users\aksch\AppData\Local\Programs\Python\Python38-32\lib\site-packages\selenium\webdriver\support\expected_conditions.py", line 411, in _find_element return driver.find_element(*by) TypeError: find_element() argument after * must be an iterable, not WebElement Process finished with exit code 1
Et c'est l'erreur
from selenium import webdriver from selenium.common.exceptions import TimeoutException from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.support.wait import WebDriverWait driver = webdriver.Chrome("C:/Users/aksch/Downloads/chromedriver_win32/chromedriver.exe") driver.get("https://youtube.com") searchBox = driver.find_element_by_xpath("//*[@id=\"search\"]") searchButton = driver.find_element_by_xpath("//*[@id=\"search-icon-legacy\"]") try: WebDriverWait(driver, 5).until(EC.presence_of_element_located(searchBox)) except TimeoutException: print("Timed out waiting for page to load") searchBox.send_keys("Something") searchButton.click()
3 Réponses :
Le fait est que le code est plus rapide que le téléchargement du site Web. Ainsi, après avoir ouvert le site Web, vous devez ajouter du temps de sommeil au programme.
driver = webdriver.Chrome("C:/Users/aksch/Downloads/chromedriver_win32/chromedriver.exe") sleep(3)
Ici, j'ajoute 10 secondes de temps de sommeil. Donc, après chaque ligne, ajoutez simplement ce sommeil.
from time import sleep sleep(10)
Utilisez également une impression pour vérifier dans quelle ligne vous êtes bloqué.
La raison de votre erreur est
Fondamentalement, certaines méthodes EC (Conditions attendues) utilisent des localisateurs, tandis que d'autres utilisent des éléments. Celui que vous avez utilisé n'accepte qu'un localisateur, mais vous avez fourni un élément à la place.
`element est un objet WebElement. locator est un tuple de (par, chemin).
»
Référence: - Comment corriger l'erreur TypeError lors de la recherche d'un élément à l'aide de Selenium?
Fais-le comme ça:-
import time driver = webdriver.Chrome("C:/Users/.../Downloads/.../chromedriver.exe") driver.get("https://youtube.com") time.sleep(5) driver.maximize_window() searchBox = driver.find_element_by_class_name("style-scope ytd-searchbox") searchButton = driver.find_element_by_id("search-icon-legacy") searchBox.send_keys("Something") searchButton.click()
J'ai encore un doute, pourquoi "driver.find_element_by_xpath ('// * [@ id =" search "]')" cela ne fonctionne pas?
Ce n'était pas le problème. Le problème est .until(EC.presence_of_element_located
Comme je l'ai dit. Les conditions attendues peuvent utiliser un locator
ou un element
. Vous xpath
un element
trouvé par xpath
. EC
attendait un tuple
Quand j'ai utilisé votre code et utilisé "driver.find_element_by_xpath ('// * [@ id =" search "]')" au lieu de "driver.find_element_by_class_name (" style-scope ytd-searchbox ")" j'obtiens un élément "not erreur "interactable".
L'erreur «Message: élément non interactif» se produit principalement lorsque votre élément n'est pas cliquable ou qu'il n'est pas encore visible, et vous devez cliquer ou choisir un autre élément avant lui. Ensuite, votre élément s'affichera et vous pourrez le modifier.
J'ai trouvé le problème, j'ai dû utiliser le xpath complet.
Le code ci-dessous devrait fonctionner pour vous .. il y a un changement de syntaxe pour la condition attendue, il prendra donc une entrée comme type de localisateur et localisateur
vérifiez votre localisateur pour la boîte de saisie, il ne détecte pas que j'ai également corrigé cela
from selenium import webdriver from selenium.common.exceptions import TimeoutException from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.support.wait import WebDriverWait from selenium.webdriver.common.by import By driver = webdriver.Chrome("C:/Users///chromedriver.exe") driver.get("https://youtube.com") driver.maximize_window() searchBox = driver.find_element_by_css_selector("#search-form #container input") searchButton = driver.find_element_by_id("search-icon-legacy") try: WebDriverWait(driver, 10).until(EC.visibility_of_element_located((By.CSS_SELECTOR, "#search-form #container input"))) except TimeoutException: print("Timed out waiting for page to load") searchBox.send_keys("Something") searchButton.click()