1
votes

J'essaye de rechercher un mot-clé sur youtube en utilisant Selenium en python

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


0 commentaires

3 Réponses :


-1
votes

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é.


0 commentaires

0
votes

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


5 commentaires

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.



0
votes

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


0 commentaires