Jak kliknąć przycisk włączony ember.js przy użyciu Selenium i Python
Starałem się, aby było to klikalne i po prostu nie mogę zrozumieć, co robię źle. Próbuję też wywołać webdriverwait, aby został kliknięty, gdy się pojawi.
To jest mój kod do tej pory:
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()
to jest kod źródłowy przycisku, który próbuję uaktywnić:
<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>
Odpowiedzi
Żądanym elementem jest element Ember.js , a wartość id
atrybutu <button>
będzie zmieniała się dynamicznie za każdym razem, gdy uzyskasz dostęp do AUT (testowana aplikacja) . W związku z click()
tym element, który musisz wywołać WebDriverWait for the element_to_be_clickable()
i możesz użyć jednej z następujących strategii lokalizacji :
Używając
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()
Używając
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()
Uwaga : musisz dodać następujące importy:
from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.common.by import By from selenium.webdriver.support import expected_conditions as EC
Bibliografia
Możesz znaleźć kilka odpowiednich szczegółowych dyskusji w:
- Selen - znajdowanie pierwiastka na bazie żaru
- Ścieżka selenu rozwijana przez żar
Może to pomóc, ale miałem problemy z tym, że webdriver nie klikał przycisku, gdy używam identyfikatora, aby go znaleźć. Rozwiązaniem, które znalazłem, jest użycie xpath zamiast identyfikatora. W ten sposób warto spróbować.
driver.find_element_by_xpath("""//*[@id="submit-button"]""").click()