69
votes

Les commandes find_element_by_ * sont obsolètes en sélénium

Lors du démarrage de la fonction

`find_element_by_* commands are deprecated` 

J'obtiens des erreurs comme celles-ci:

<ipython-input-27-c5a7960e105f>:6: DeprecationWarning: executable_path has been deprecated, please pass in a Service object
  driver = webdriver.Chrome(executable_path=driver_path)
<ipython-input-27-c5a7960e105f>:10: DeprecationWarning: find_element_by_* commands are deprecated. Please use find_element() instead
  button = driver.find_element_by_class_name("quiz_button")


1 commentaires

Essayez de vérifier celui-ci. Correspond à votre requête. stackoverflow.com/questions/61308799 /…


4 Réponses :


152
votes

Ce message d'erreur ...

element = driver.find_element(By.XPATH, "element_xpath")
  • Utilisation class_name :

    element = driver.find_element(By.CSS_SELECTOR, "element_css_selector")
    

Dans des lignes similaires, vous devez également modifier ce qui suit:

  • Utilisation de id :

    element = driver.find_element(By.TAG_NAME, "element_tag_name")
    
  • Utilisation de nom :

    element = driver.find_element(By.PARTIAL_LINK_TEXT, "element_partial_link_text")
    
  • Utilisation link_text :

    element = driver.find_element(By.LINK_TEXT, "element_link_text")
    
  • Utilisation partial_link_text :

    element = driver.find_element(By.NAME, "element_name")
    
  • Utilisation tag_name :

    element = driver.find_element(By.ID, "element_id")
    
  • Utilisation de css_selector :

    button = driver.find_element(By.CLASS_NAME, "quiz_button")
    
  • Utilisation de xpath :

    from selenium.webdriver.common.by import By
    

Remarque: Si vous recherchez et remplacez pour implémenter les modifications ci-dessus, vous devrez faire la même chose pour find_elements _ * , c'est-à-dire le pluriel Formulaires de find_element _ * .

Vous pouvez également trouver ce guide de mise à niveau utile car il couvre d'autres modifications non liées que vous devrez peut-être apporter lors de la mise à niveau: https://www.selenium.dev/documentation/webdriver/getting_started/upgrade_to_selenium_4/ p> p>


4 commentaires

NameError: le nom «par» n'est pas défini


de selenium.webdriver.common. par importation par


C'est génial, c'est beaucoup des commandes dans la récente syntaxe légèrement différente. Mais ce que je vois manquer, c'est le "Send_keys". Également sur le site Web de Selenium, ils n'ont pas encore d'exemple pour les "Send_keys" mais invitent à quiconque à apporter un exemple. selenium.dev/documentation/webdriver/actions_api/key/…, également si vous pouvez mettre un exemple Send_keys ici dans votre réponse. Actuellement, j'essaie l'exemple Send_keys avec Driver.Find_element (by.id, 'element_name'). Si vous pouvez y mettre cela, ce serait génial. Merci,


Qu'en est-il de ceci - emailaddress_input = driver.find_elements_by_xpath (x_path) [index], comment puis-je fournir l'index si je remplace find_elements_by_xpath avec find_element *.



6
votes

@debanjanb a mentionné et expliqué la nouvelle structure, il vaut également mieux utiliser ces lignes:

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.chrome.service import Service

s = Service('C:/Users/.../chromedriver.exe')
driver = webdriver.Chrome(service=s)


2 commentaires

À quoi servent les touches dans cet exemple?


@Arete, By et Key seront utilisés pour détecter les données cibles et entrées! , ces lignes sont la structure principale.



1
votes

Comme d'autres l'ont mentionné, vous devez utiliser find_element () ou find_elements () au lieu de find_element_by _ * () ou find_elements_by_ * () .

J'ai écrit le modèle Regex pour remplacer les méthodes obsolètes à une nouvelle, alors essayez ceci si vous avez besoin.

from selenium.webdriver.common.by import By

Remarque: vous avez besoin la ligne d'importation pour utiliser les nouvelles méthodes

# from - e.g. find_element_by_id("test")

find_element(s?)_by_([a-z]+)\((.*)

# to - e.g. find_element(By.ID, "test")

find_element$1(By.\U$2\E, $3


0 commentaires

0
votes

Voici un exemple qui clarifiera un peu les choses:

from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By

chrome_driver_path = "C:\Development\chromedriver_win32\chromedriver.exe"
s = Service(chrome_driver_path)
driver = webdriver.Chrome(service=s)

driver.get('https://www.amazon.in/Apple-MacBook-Chip-13-inch-256GB/dp/B08N5VSQNG/')
title = driver.find_element(by=By.ID, value="productTitle")  # by=By.ID, By.TAG_NAME, By.CLASS_NAME, By.NAME
print(title.text)


# driver.close()  # Closes the tab which was opened earlier
driver.quit()  # Quits the entire browser.


0 commentaires