0
votes

Sélénium identifie le bouton comme cliquable lorsque ce n'était pas

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 xxx

après la date de la date et de l'heure est choisi, le bouton devient xxx

J'essaie d'utiliser ce code pour attendre que le bouton soit cliquable sur xxx

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?


5 commentaires

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


3 Réponses :


0
votes

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']")))


0 commentaires

0
votes

SELENIUM Vérifie IsClicable pour ISDisplayed et est activé pour vérifier Click Capacité

et ISDISPLAY vérifie l'attribut de style, mais des vérifications isenabulées pour attribut désactivé

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

si une condition cliquable ne fonctionne pas dans ces cas

https: // www .selenium.Dev / selenium / Docs / API / Py / WebDriver_Support / selenium.webdriver.support.expeced_conditions.html

donc dans ce cas, le clic ne jette pas une erreur

https://github.com/seleniumhq /Selenium/blob/trunk/py/selenium/common/Exception.py

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é


0 commentaires

0
votes

element_to_be_clickable ()

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> xxx pré>

MAINTENANT lorsque le site Web charge même sans la date ou le créneau horaire choisi, la présence de la valeur 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 cliquable fort>. P>

Si idéalement, d'attendre que le bouton soit cliquable, vous devez induire webDriverwait pour le ollement_to_be_clickable () code> et vous pouvez utiliser l'un des éléments suivants Stratégies de localisation : p>

  • 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, "//div[contains(@class, 'p_AFTextOnly')]/a[@onclick]/span[text()='Book']"))).click()
    
  • note forte>: Vous devez ajouter les importations suivantes: p>

    WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.CSS_SELECTOR, "div.p_AFTextOnly > a[onclick] > span.xfx"))).click()
    


0 commentaires