SeleniumとPythonを使用してember.js対応ボタンをクリックする方法

Nov 21 2020

私はこれをクリック可能にしようとしてきましたが、何が間違っているのか理解できません。また、webdriverwaitを誘導して、表示されたときにクリックされるようにしようとしています。

これはこれまでの私のコードです:

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

これは、クリック可能にしようとしているボタンのソースコードです。

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

回答

DebanjanB Nov 22 2020 at 20:59

目的の要素はEmber.js要素であり、AUT(テスト対象アプリケーション)にアクセスするたびに、のid属性の値が<button>動的に変化し続けます。したがって、要素に対してWebDriverWaitを誘導する必要があり、次のロケーター戦略のいずれかを使用できます。click()element_to_be_clickable()

  • 使用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()
    
  • 使用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()
    
  • :次のインポートを追加する必要があります:

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

参考文献

関連する詳細なディスカッションがいくつかあります。

  • セレン-残り火に基づいて元素を見つける
  • エンバードロップダウンセレンxpath
ImCrimson Nov 22 2020 at 05:17

これは役立つかもしれませんが、IDを使用してボタンを見つけるときにwebdriverがボタンをクリックしないという問題が発生しました。私が見つけた回避策は、idの代わりにxpathを使用することです。このように、試してみる価値があります。

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