0
votes

Comment sélectionner une liste déroulante à l'aide de sélénium?

J'essaie de sélectionner Cotes de l'UE CODE> à partir de la liste déroulante dans ce HTML:

Exception has occurred: NoSuchElementException
Message: no such element: Unable to locate element: {"method":"css selector","selector":"user-header-r1 > ul"}


2 commentaires

User-Header-R1 est un identifiant, pas une classe CSS, vous essayez de trouver l'élément par sélecteur CSS, ce qui n'existe pas. Essayez de trouver la recherche par id


Merci. Essayé ceci: self.driver.find_element_by_id ("User-Header-R1> ul"). Find_Element_by_xpath ("./ LI [. =" Target + "]"). Cliquez sur () MAIS < Code> Impossible de localiser l'élément: {"Méthode": "Sélecteur CSS", "Sélecteur": "[ID =" User-Header-R1> UL "]"} . Comme vous pouvez dire que je suis vraiment nouveau de gratter afin que je puisse avoir besoin de petits pas!


4 Réponses :


1
votes

Développer Dropdown et faire Li code> éléments visibles. WebDriverwait code> attendra les conditions d'élément requises, dans votre cas, c'est une visibilité. Pour obtenir l'élément par texte en utilisant XPath, vous devez utiliser des quotas // li [. = 'Quelque texte'] code> dans le texte:

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

driver = webdriver.Chrome()
wait = WebDriverWait(driver, 5)
driver.get("..")

target = "EU Odds"
driver.find_element(By.ID, "user-header-oddsformat-expander").click()
wait.until(ec.element_to_be_clickable((By.XPATH, "//li[.='" + target + "']"))).click()


5 commentaires

Je reçois l'erreur suivante sur la dernière ligne: a eu lieu: l'objet Typeerror 'str' n'est pas appelable


Typo avec arguments de la méthode. Fixé


Merci! Fini par l'utiliser car j'avais des problèmes avec la réponse acceptée. L'élément cliquable ne se chargeait pas avant que cet extrait ait essayé de cliquer dessus.


A parlé bientôt! Semble être intermittent - parfois il sélectionne cotes de l'UE et parfois ce n'est pas :( pilote.find_element (by.Id, "User-Header-OddsFormat-Expander"). Cliquez sur () sélectionne définitivement la liste déroulante. Si je passe par wait.untitil (EC.Element_to_be_clickable (((by.xpath, "//li[.= '" + cible + "']")))). Cliquez sur () alors il sélectionne toujours Cotes de l'UE . Etrange comme ma compréhension de cette ligne est que le sélénium est censé attendre jusqu'à ce qu'il puisse sélectionner Cotes de l'UE ?


A réussi à aller autour de cela en mettant un pendant que en boucle dans cette vérification, le bon élément a été sélectionné ou le code de sélection retentit. Permet toujours de le faire juste après 2-3 tentatives, mais certainement aucune consistance!



0
votes

Pour sélectionner l'élément avec du texte sous la forme Cotes de l'UE forte> Vous devez induire WebDriverWait element_to_be_clickable () code> et vous pouvez utiliser des éléments suivants Stratégies de localisation :

  • en utilisant css_selector code>: p>

    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.common.by import By
    from selenium.webdriver.support import expected_conditions as EC
    
  • en utilisant xpath code>: p>

    WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//ul[@id='user-header-oddsformat']//li/a[starts-with(@onclick, 'changeOddsFormat')]/span[text()='EU Odds']"))).click()
    
  • note forte>: Vous devez ajouter les importations suivantes: p>

    WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.CSS_SELECTOR, "ul#user-header-oddsformat li:first-child>a[onclick^='changeOddsFormat']>span"))).click()
    


1 commentaires

Ces deux temps tristement :(



1
votes

Target de votre élément ayant l'attribut avec Caché code> Valeur:

... blockQuote>

Donc, je pense que vous avez besoin d'une gâchette d'un autre élément avant d'attaquer la cible d'élément, essayez de suivre le code suivant: p>

#click this first
self.driver.find_element_by_css_selector('div#user-header-r1 > div > a#user-header-oddsformat-expander > span').click()

target = 'EU Odds'
self.driver.find_element_by_xpath('//ul[@id="user-header-oddsformat"]//span[text()="' +target +'"]').click()


0 commentaires

0
votes

formez l'élément HTML, l'élément que vous essayez de sélectionner a une identité nommée User-Header-R1 Pas une classe CSS, essayez d'utiliser Find_Element_by_id ('User-Header-R1') Ensuite, si l'élément est trouvé, essayez d'utiliser wind_element_by_tag_name ('ul') sur la même recherche, comme: xxx

Ceci ouvrira d'abord l'arborescence HTML pour Un identifiant de user-header-r1 qui est le premier div puis trouve l'élément ul à l'intérieur du div < / p>


0 commentaires