【问题标题】:How to fix Element Not Interactable in Error Python Selenium Chromdriver [duplicate]如何修复错误 Python Selenium Chromedriver 中不可交互的元素 [重复]
【发布时间】:2019-09-30 17:31:10
【问题描述】:

Image of HTML code

我正在尝试使用 Python 和 selenium ChromeDriver 将值传递给输入元素。 我能够在第一个字段中设置 cc # 但对于名称我得到保持错误元素不可交互。

我尝试了多种方法来找到解决方案: - 将驱动程序切换到 iframe - 使用动作链 - 使用 WebDriveWait,元素可见,元素可点击 -使用Javascript执行脚本

'''蟒蛇

    def addCC(mCCNumber,driver,mCardName,mExpiry,mSecCode):      
    # move the driver to the first iFrame 
    #driver.find_elements_by_tag_name("iframe")[0]
    iframe = driver.find_element_by_xpath("//iframe[@class='card-fields-iframe']")
    mainWin = driver.current_window_handle  
    # move the driver to the first iFrame 
    #driver.switch_to_frame(driver.find_elements_by_tag_name("iframe")[0]) 
    driver.switch_to_frame(iframe)
    ccnumber = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH ,"//input[@placeholder='Card number']")))
    ccnumber.send_keys(mCCNumber)
    #driver.switch_to_window(mainWin)  
    time.sleep(1)

    #cardname = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH ,"//input[@autocomplete='cc-name']")))
    #WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH ,"//input[@autocomplete='cc-name']")))
    #webdriver.ActionChains(driver).move_to_element(cardname).send_keys(mCardName).perform()
    #webdriver.ActionChains(driver).move_to_element(cardname).click(cardname).send_keys(mCardName).perform()
    #element = WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//input[@autocomplete='cc-name']")))
    #driver.execute_script("arguments[0].value= 'dummy dumm';", element)
    element = driver.find_element_by_xpath("//input[@autocomplete='cc-name']")
    webdriver.ActionChains(driver).move_to_element(element).click(element).send_keys(mCardName).perform()
    element.send_keys(mCardName)
    driver.switch_to_window(mainWin)  
    time.sleep(1)
    driver.switch_to_frame(driver.find_elements_by_tag_name("iframe")[0])  
    expdate = WebDriverWait(driver, 10).until(
            EC.presence_of_element_located((By.XPATH ,"//input[@id='expiry']"))
            )
    WebDriverWait(driver, 20).until(
            EC.element_to_be_clickable((By.XPATH ,"//input[@id='expiry']"))
            )
    expdate.send_keys(mExpiry)
    driver.switch_to_window(mainWin)  
    time.sleep(1)
    driver.switch_to_frame(driver.find_elements_by_tag_name("iframe")[0])  
    seccode = WebDriverWait(driver, 10).until(
            EC.presence_of_element_located((By.XPATH ,"//input[@placeholder='Security code']"))
            )
    seccode.send_keys(mSecCode)
    driver.switch_to_window(mainWin)  
    time.sleep(3)
    #eles = driver.find_elements_by_xpath('//*[@id]')
    #for ele in eles:
    #    print(ele.tag_name)

'''

【问题讨论】:

  • 您能否发布一些您正在尝试测试的页面的 HTML,包括 iframe 元素和您想要向其发送密钥的 CC 字段?这将有助于追查问题。您的 iframe 代码看起来正确,并且元素不可交互与元素本身有关。如果是 iframe 问题,您只会看到 webdriver 超时。
  • @Christine 感谢您的回复,我添加了指向页面 HTML 图像的链接。对于上下文,我可以找到并通过 CC#,但不是卡上的名称而不会出错。

标签: python selenium iframe selenium-chromedriver


【解决方案1】:

您可以尝试使用 Javascript 设置元素值:

 def addCC(mCCNumber,driver,mCardName,mExpiry,mSecCode):   

    # move the driver to the first iFrame 
    iframe = driver.find_element_by_xpath("//iframe[@class='card-fields-iframe']")

    # save main window context
    mainWin = driver.current_window_handle  

    # move the driver to the first iFrame 
    driver.switch_to_frame(iframe)

    # enter CC number
    ccnumber = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH ,"//input[@placeholder='Card number']")))
    ccnumber.send_keys(mCCNumber)

    time.sleep(1)

    # get CC name element   
    ccNameElement = driver.find_element_by_xpath("//input[@id='name']")

    # click CC name element with JS to activate it
    driver.execute_script("arguments[0].click();", ccNameElement);
    ccNameElement.click()

    # set cc name using send_keys
    ccNameElement.send_keys(mCardName)


【讨论】:

  • 我尝试使用 javascript 设置值,但没有任何反应。代码运行,但输入中没有输入任何内容。
  • driver.execute_script("arguments[0].setAttribute('value', 'mCardName')", element)
  • @robertRoberts 我在setAttribute(); 之后错过了一个分号。你可以试试driver.executeScript("arguments[0].setAttribute('value', mCardName);", ccNameElement); 吗?另外,你可以运行 print(ccNameElement) 来确保元素的位置正确吗?
  • 使用此脚本 driver.execute_script("arguments[0].setAttribute('value', mCardName);", NameElement) 我得到 javascript 错误 mCardName 未定义。
  • driver.execute_script("arguments[0].setAttribute('value', '" + mCardName + "');", NameElement) 像这样传递变量,我没有收到错误但值未设置为输入。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-12-08
  • 2019-08-29
  • 1970-01-01
  • 1970-01-01
  • 2023-04-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多