Je vais avoir un problème où sélénium dit qu'un bouton est cliquable, même s'il est désactivé.
J'utilise sélénium avec un site Web où vous devez sélectionner une date d'abord, puis la créneau horaire d'une liste déroulante avant Le bouton "livre" cliquait et fera tout. Avant que la date et la fente temporelle sont choisies, l'élément de bouton est p> après la date de la date et de l'heure est choisi, le bouton devient p> J'essaie d'utiliser ce code pour attendre que le bouton soit cliquable sur p> mais sélénium dit que le bouton est cliquable presque immédiatement sur le site web Même sans une date ou une fente temporelle choisie et que le bouton étant complètement grisé et décolletable. J'ai testé cela en vérifiant les horodatages d'après la navigation sur l'URL et après avoir attendu que le bouton soit cliquable, et il n'y a presque pas de retard. J'ai manuellement eu recours à un essai à l'exception de la boucle et de dormir entre les deux pour pouvoir cliquer sur le bouton avec succès, mais préfère comprendre ce qui cause cette question. Des idées? P> p>
3 Réponses :
Résolu ceci en recherchant juste l'attribut de classe à modifier au lieu de l'élément_to_be_clickable.
wait.until(EC.visibility_of_element_located((By.CSS_SELECTOR, "div[class='x28o xfn p_AFTextOnly']")))
SELENIUM Vérifie IsClicable pour ISDisplayed et est activé pour vérifier Click Capacité P>
et ISDISPLAY vérifie l'attribut de style, mais des vérifications isenabulées pour attribut désactivé p>
Maintenant désactivé est gérer non pas via l'attribut Désactiver HTML dans la plupart des cas, mais uniquement sur les classes JavaScript et CSS P>
si une condition cliquable ne fonctionne pas dans ces cas p>
donc dans ce cas, le clic ne jette pas une erreur p>
https://github.com/seleniumhq /Selenium/blob/trunk/py/selenium/common/Exception.py p>
Si vous vérifiez que la classe d'exception, vous pouvez voir que les exceptions ne sont présentes que pour NON visible, cliquez sur Intercepté et non activé P>
MAINTENANT lorsque le site Web charge même sans la date ou le créneau horaire choisi, la présence de la valeur Si idéalement, d'attendre que le bouton soit cliquable, vous devez induire webDriverwait pour le en utilisant en utilisant note forte>: Vous devez ajouter les importations suivantes: p>
ollement_to_be_clickable code>
est que l'attente de la vérification d'un élément est visible et activée de telle sorte que vous puissiez cliquer dessus. C'est défini A > Comme: p> p_afdisabled code> pour le L'attribut de classe em> détermine si l'élément est activé em> ou désactivé em>. Ensuite, lorsque vous remplissez la date ou la créneau horaire La valeur
p_afdisabled code> pour l'attribut la classe em> est supprimée et que l'élément devient
ollement_to_be_clickable () code> et vous pouvez utiliser l'un des éléments suivants Stratégies de localisation : p>
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
xpath code>: p>
WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//div[contains(@class, 'p_AFTextOnly')]/a[@onclick]/span[text()='Book']"))).click()
WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.CSS_SELECTOR, "div.p_AFTextOnly > a[onclick] > span.xfx"))).click()
Le sélénium ne détecte pas vraiment si l'élément est recouvert d'une autre, effondré à 1 point ou gère le clic dans la façon dont vous ne voulez pas. L'élément est cliquable lorsque cela est capable d'accepter un événement de clic s'il est impossible de cliquer sur un.
Y a-t-il un moyen d'attendre que le bouton soit réellement cliquable à l'aide de sélénium? Les propriétés de l'élément changent beaucoup de temps lorsqu'elle est en réalité et n'est pas cliquée. Je ne suis pas très familier avec les capacités de Sélenium par exemple, mais cela pourrait éventuellement attendre que la classe ne contienne pas le texte désactivé ni attendre que le bouton ait une destination de liaison ou quelque chose.
Cela dépend de l'élément et des circonstances spécifiques. Je devais mettre une déclaration JS supplémentaire comme une condition d'attente lorsque Elemet a des ptoperties spécifiques définies pour assurer que l'élément est vraiment dans l'état cliquable du point de vue de l'utilisateur.
Quelles fonctions de sélénium avez-vous utilisées pour cela? J'ai énuméré l'état de l'élément à la fois lorsqu'il n'est pas ni cliquée, vous vous demandez donc si vous avez des idées sur lesquelles les propriétés sont les plus utiles pour la différenciation.
J'utilise
exécuteur_script () code> (voir Cet exemple ). Mais la plupart du travail pour me fournir ANSVER si les conditions de clic sont remplies, faites notre ingénieur avant. Désolé, tout ce que je sais maintenant.