如何单击包含每次使用 Selenium 更改的信用卡号的元素 Python

How to click on element which contains a credit card number that changes each time with Selenium Python

我在信用卡付款表格中找不到元素,其中包含一个每次都会更改的数字,所以请帮我找到方法。

这是元素:

<input id="adyen-checkout-encryptedCardNumber-1644589302666" data-fieldtype="encryptedCardNumber" type="text" inputmode="numeric" maxlength="24" autocomplete="cc-number" placeholder="1234 5678 9012 3456" aria-label="Champ du numéro de carte" aria-invalid="true" aria-required="true" aria-describedby="adyen-checkout-encryptedCardNumber-1644589302666-ariaError" class="js-iframe-input input-field" data-type="gsf" style="display: block;">

您可以使用的各种定位器策略(根据查询中提供的 DOM):

都是xpath

//input[@data-fieldtype='encryptedCardNumber']

//input[@type='text']

//input[@inputmode='numeric']

//input[@aria-label='Champ du numéro de carte']

这个HTML...

<input id="adyen-checkout-encryptedCardNumber-1644589302666" data-fieldtype="encryptedCardNumber" type="text" inputmode="numeric" maxlength="24" autocomplete="cc-number" placeholder="1234 5678 9012 3456" aria-label="Champ du numéro de carte" aria-invalid="true" aria-required="true" aria-describedby="adyen-checkout-encryptedCardNumber-1644589302666-ariaError" class="js-iframe-input input-field" data-type="gsf" style="display: block;">

...表示一个字段。

通常 信用卡号 字段位于 内。因此,要访问 Creditcard Number 字段,您必须:

  • 诱导 WebDriverWait 所需的 帧可用并切换到它.

  • 诱导 所需的 元素可点击

  • 您可以使用以下任一项:

    • 使用CSS_SELECTOR:

      WebDriverWait(driver, 20).until(EC.frame_to_be_available_and_switch_to_it((By.CSS_SELECTOR,"iframe_css")))
      WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.CSS_SELECTOR, "input[data-fieldtype='encryptedCardNumber'][aria-label='Champ du numéro de carte']"))).send_keys("1234567890")
      
    • 使用 XPATH:

      WebDriverWait(driver, 20).until(EC.frame_to_be_available_and_switch_to_it((By.XPATH,"iframe_xpath")))
      WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//input[@data-fieldtype='encryptedCardNumber' and @aria-label='Champ du numéro de carte']"))).send_keys("1234567890")
      
  • 注意:您必须添加以下导入:

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

参考

您可以在以下位置找到一些相关讨论:

  • Switch to an iframe through Selenium and python

谢谢@undetected Selenium 的回复,这是一个框架问题,所以这就是我所做的,它对我来说很好用:

WebDriverWait(driver, 20).until(EC.frame_to_be_available_and_switch_to_it((By.XPATH, "//*[@id='adyen-card-container']/div/div/div[2]/div[1]/div[1]/label/div/span/iframe")))
WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH,"//input[@data-fieldtype='encryptedCardNumber']"))).send_keys("0000111122223333")
##switch parent frame
self.driver.switch_to.default_content()
WebDriverWait(driver, 20).until(EC.frame_to_be_available_and_switch_to_it(
        (By.XPATH, "//*[@id='adyen-card-container']/div/div/div[2]/div[1]/div[2]/div[1]/label/div/span/iframe")))
WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH,"//input[@data-fieldtype='encryptedExpiryDate']"))).send_keys("0228")
##switch parent frame
self.driver.switch_to.default_content()
WebDriverWait(driver, 20).until(EC.frame_to_be_available_and_switch_to_it(
        (By.XPATH,  "//*[@id='adyen-card-container']/div/div/div[2]/div[1]/div[2]/div[2]/label/div/span/iframe")))
WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//input[@data-fieldtype='encryptedSecurityCode']"))).send_keys("123")