【问题标题】:How to click on element which contains a credit card number that changes each time with Selenium Python如何单击包含每次使用 Selenium Python 更改的信用卡号的元素
【发布时间】:2022-02-12 07:27:33
【问题描述】:

我在信用卡支付表单上查找元素时遇到问题,其中包含一个每次都会更改的数字,所以请帮我找到方法。

这是元素:

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

【问题讨论】:

    标签: python selenium xpath css-selectors credit-card


    【解决方案1】:

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

    都是xpaths

    //input[@data-fieldtype='encryptedCardNumber']
    
    //input[@type='text']
    
    //input[@inputmode='numeric']
    
    //input[@aria-label='Champ du numéro de carte']
    

    【讨论】:

    • 我使用此代码但没有点击 def enter_cart_credit_card_number(self, credit_card_number): cart_credit_card_number_id = WebDriverWait(self.driver, 50) cart_credit_card_number_id.until(EC.visibility_of_element_located((By.XPATH, "//input [@data-fieldtype='encryptedCardNumber']"))).click() self.driver.find_element_by_xpath("//input[@data-fieldtype='encryptedCardNumber']").clear() self.driver.find_element_by_xpath( "//input[@data-fieldtype='encryptedCardNumber']").send_keys(credit_card_number)
    • 这确实适用于我,使用您在查询中提供的代码:cc = WebDriverWait(driver, 10).until(EC.visibility_of_element_located((By.XPATH, "//input[@data-fieldtype='encryptedCardNumber']"))) cc.clear() cc.send_keys('5434234567788')
    • 不适合我
    • 很抱歉,但需要检查网站。可以提供网站链接吗?
    • 这是一个实习生网站
    【解决方案2】:

    这个 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 字段。

    通常信用卡号字段位于&lt;iframe&gt; 中。因此,要访问 Creditcard Number 字段,您必须:

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

    • 诱导WebDriverWait 使所需的元素可点击

    • 您可以使用以下任一locator strategies

      • 使用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
      

    参考

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

    【讨论】:

      【解决方案3】:

      感谢@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")
          
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-03-31
        • 1970-01-01
        • 2017-11-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多