Come fare clic sul pulsante abilitato ember.js utilizzando Selenium e Python

Nov 21 2020

Ho cercato di renderlo cliccabile e non riesco a capire cosa sto facendo di sbagliato. Sto anche cercando di indurre webdriverwait, in modo che venga cliccato quando appare.

Questo è il mio codice finora:

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

questo è il codice sorgente del pulsante che sto cercando di rendere cliccabile:

<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>

Risposte

DebanjanB Nov 22 2020 at 20:59

L'elemento desiderato è un elemento Ember.js e il valore iddell'attributo di <button>continuerà a cambiare dinamicamente, ogni volta che si accede all'AUT (Application Under Test) . Quindi per click()l'elemento devi indurre WebDriverWait per element_to_be_clickable()e puoi utilizzare una delle seguenti strategie di localizzazione :

  • Utilizzando 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()
    
  • Utilizzando 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()
    
  • Nota : devi aggiungere le seguenti importazioni:

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

Riferimenti

Puoi trovare un paio di discussioni dettagliate pertinenti in:

  • Selenio - Elemento di ricerca basato sulla brace
  • Ember menu a discesa selenio xpath
ImCrimson Nov 22 2020 at 05:17

Questo può aiutare ma ho avuto problemi con il webdriver che non fa clic su un pulsante quando uso l'ID per trovarlo. Il lavoro che ho trovato sta usando xpath invece dell'id. In questo modo, vale la pena provare.

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