Comment cliquer sur le bouton activé pour ember.js en utilisant Selenium et Python

Nov 21 2020

J'ai essayé de rendre cela cliquable et je ne peux tout simplement pas comprendre ce que je fais de mal. J'essaye également d'induire webdriverwait, de sorte qu'il soit cliqué quand il apparaît.

C'est mon code pour l'instant:

def order(k):
    driver = webdriver.Chrome(os.getcwd()+"\\webdriver\\chromedriver.exe") 
    driver.get("website.com/login-to-checkout")
    driver.find_element_by_id('i0116').send_keys(k["email"])
    driver.find_element_by_id('i0118').send_keys(k["password"])
    driver.find_element_by_id('idSIButton9').click()
    delay()
    #sign in button
    driver.find_element_by_id('idSIButton9').click()
    #Button below I cant get to be clicked
    with webdriver.Chrome() as driver:
        wait = WebDriverWait(driver, 7)
        wait.until(presence_of_element_located((By.CSS_SELECTOR, "#ember1053")))
        driver.find_element(By.id, "ember1053").click()

voici le code source du bouton que j'essaie de rendre cliquable:

<div id="ember1037" class="btn-group m-b-lg m-t-lg order-call-to-action ember-view"><!---->        <!--biBehavior 80 means place order Place Order-->

<button aria-live="polite" type="button" tabindex="0" data-m="{&quot;aN&quot;:&quot;shoppingCart&quot;,&quot;cN&quot;:&quot;PlaceOrder&quot;,&quot;bhvr&quot;:80}" id="ember1053" class="btn theme-default btn-primary cli-purchase ember-view"><!---->            Place order

</button></div>

Réponses

DebanjanB Nov 22 2020 at 20:59

L'élément souhaité est un élément Ember.js et la valeur de l' idattribut de <button>continuera à changer dynamiquement, chaque fois que vous accédez à l' AUT (Application Under Test) . Par conséquent, click()sur l'élément, vous devez induire WebDriverWait pour le element_to_be_clickable()et vous pouvez utiliser l'une des stratégies de localisation suivantes :

  • Utilisation CSS_SELECTOR:

    WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.CSS_SELECTOR, "button.btn.theme-default.btn-primary.cli-purchase.ember-view[id^='ember'][type='button'][aria-live='polite']"))).click()
    
  • Utilisation XPATH:

    WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//button[@class='btn theme-default btn-primary cli-purchase ember-view' and starts-with(@id,'ember')][contains(., 'Place order') and @aria-live='polite']"))).click()
    
  • Remarque : vous devez ajouter les importations suivantes:

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

Références

Vous pouvez trouver quelques discussions détaillées pertinentes dans:

  • Sélénium - élément de recherche basé sur la braise
  • Ember dropdown sélénium xpath
ImCrimson Nov 22 2020 at 05:17

Cela peut aider, mais j'ai eu des problèmes avec le pilote Web qui ne clique pas sur un bouton lorsque j'utilise l'identifiant pour le trouver. Le travail autour que j'ai trouvé utilise le xpath au lieu de l'id. Comme ça, ça vaut le coup d'essayer.

driver.find_element_by_xpath("""//*[@id="submit-button"]""").click()