Come fare clic sul pulsante abilitato ember.js utilizzando Selenium e Python
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="{"aN":"shoppingCart","cN":"PlaceOrder","bhvr":80}" id="ember1053" class="btn theme-default btn-primary cli-purchase ember-view"><!----> Place order
</button></div>
Risposte
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
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()