2
votes

Comment cliquer sur ce bouton avec Selenium?

Voici toutes les parties de l'élément sur lesquelles je suis en train de cliquer selon 'Inspecter':

browser.find_element_by_css_selector('button[type=button]').click()

browser.find_elements_by_xpath("//*[contains(text(), 'Done')]").click()

# The above returns a list for some reason?

browser.find_elements_by_css_selector('done.ui-button.ui-corner-all.ui-widget')

Lorsque je veux cliquer dessus, je suppose qu'il se trouve sur le : : avant la partie telle qu'elle est affichée et cliquable. Dans le code, je m'assure de faire défiler et d'attendre deux secondes avant de cliquer pour m'assurer que le bouton est visible et pourtant j'obtiens:

selenium.common.exceptions.ElementNotVisibleException: Message: element not interactable

Mais je ne comprends pas comment ce n'est pas interactif. Lorsque je passe la souris dessus dans l'inspecteur, tout ce qui se trouve dans est mis en surbrillance, donc le bouton sur lequel je veux cliquer doit être là, n'est-ce pas?

Voici quelques choses que j'ai essayées:

<div class="ui-dialog-buttonpane ui-widget-content ui-helper-clearfix">
    ::before
    <div class="ui-dialog-buttonset">
        <button type="button" class="done ui-button ui-corner-all ui-widget">
        Done</button>
    </div>
    ::after
</div>

J'aimerais pouvoir me souvenir de tout ce que j'ai essayé, mais j'espère que quelqu'un pourra m'aider.

p>


5 commentaires

Montrez votre page source si possible, sinon les autres ne peuvent pas déboguer pour vous aider. De plus, le sélénium peut exécuter un script, vous pouvez essayer un script javascript ou jquery pour rendre l'élément interactif ou même faire toutes les étapes avec eux.


Lorsque vous utilisez .find_elements (notez le pluriel), il renverra une liste au lieu d'un seul élément comme le fait .find_element (singulier). Avez-vous essayé browser.find_element_by_xpath ("// button [. = 'Done']") ? Si vous obtenez un len () sur ces appels .find_elements ... est-ce 1? Je me demande s'il n'y a pas plus d'un bouton qui correspond aux localisateurs que vous utilisez et le premier n'est pas visible mais vous voulez le deuxième ou le troisième, etc.


@JeffC Jeff mon ami, tu es littéralement mon héros. J'ai cliqué sur un élément spécifique dans cette liste, et cela a fonctionné à merveille. Répondez à la question avec ceci afin que vous je puisse vous donner une coche pour me donner la réponse. Vous méritez tout.


@jeepersmcface, notez qu'en cas de ElementNotVisibleException cette approche (en utilisant find_elements_ .. ) ne doit être utilisée que pour vérifier le nombre d'éléments mis en correspondance par le sélecteur, mais pas pour sélectionner l'élément requis par index. Vous devez toujours rechercher un sélecteur unique.


D'accord avec @Andersson. Je suppose qu'il y a plusieurs boutons dans le tableau, chacun sur une ligne différente. Vous devriez être capable de construire un XPath pour un bouton donné en fonction d'une valeur dans la table. C'est la meilleure façon de faire cela ... mon commentaire qui s'est transformé en réponse était plus une étape de débogage. Eh bien, il n'est pas nécessaire que ce soit une ligne dans un tableau, ce n'est qu'un exemple ...


3 Réponses :


0
votes

Pour cliquer sur l'élément car l'élément souhaité est un élément dynamique vous devez induire WebDriverWait pour que l'élément soit cliquable et vous peut utiliser l'une des solutions suivantes:

  • Utilisation de CSS_SELECTOR :

    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.common.by import By
    from selenium.webdriver.support import expected_conditions as EC
    
  • Utilisation de XPATH :

    WebDriverWait(browser, 20).until(EC.element_to_be_clickable((By.XPATH, "//div[@class='ui-dialog-buttonpane ui-widget-content ui-helper-clearfix']"))).click()
    
  • Remarque : Vous devez ajouter les importations suivantes:

    WebDriverWait(browser, 20).until(EC.element_to_be_clickable((By.CSS_SELECTOR, "div.ui-dialog-buttonpane.ui-widget-content.ui-helper-clearfix"))).click()
    

Vous pouvez trouver une discussion détaillée dans sélénium. common.exceptions.ElementNotVisibleException: Message: élément non interactif avec Selenium


2 commentaires

Hm ... J'obtiens selenium.common.exceptions.TimeoutException: Message:


Consultez la réponse mise à jour et faites-moi savoir le statut



-1
votes

Vous pouvez utiliser ActionChains pour vous déplacer vers l'élément

driver.execute_script("arguments[0].scrollIntoView();", element)

ou vous pouvez faire défiler jusqu'à ce que l'élément soit visible en utilisant scrollIntoView ():

from selenium.webdriver.common.action_chains import ActionChains
element = driver.find_elements_by_css_selector("div.ui-dialog-buttonpane.ui-widget-content.ui-helper-clearfix")

actions = ActionChains(driver)
actions.move_to_element(element).perform()

p>


0 commentaires

0
votes

Lorsque vous utilisez .find_elements (notez le pluriel), il renverra une liste au lieu d'un seul élément comme le fait .find_element (singulier). Avez-vous essayé

browser.find_element_by_xpath("//button[.='Done']")

Si vous obtenez un len () sur ces appels .find_elements ... est-ce 1? Je me demande s'il n'y a pas plus d'un bouton qui correspond aux localisateurs que vous utilisez et le premier n'est pas visible mais vous voulez le deuxième ou le troisième, etc.


0 commentaires