python - 如何修复错误 Python Selenium Chromdriver 中不可交互的元素
问题描述
我正在尝试使用 Python 和 selenium ChromeDriver 将值传递给输入元素。我能够在第一个字段中设置 cc # 但对于名称我得到保持错误元素不可交互。
我尝试了多种方法来找到解决方案: - 将驱动程序切换到 Iframe - 使用 ActionChains - 使用 WebDriveWait,元素可见,元素可点击 - 使用 Javascript 执行脚本
'''Python
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)
'''
解决方案
您可以尝试使用 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)
推荐阅读
- java - 当我只是在它周围移动鼠标时在 JPanel 上绘图
- java - Android TCP 服务器和 NVT
- php - 将数据从控制器传递到模态
- php - “此文件不执行任何操作,但会加载 * wp-blog-header.php”
- javascript - 打字稿打字没有按预期工作,我该如何解决?
- python - Pandas - Numpy.Where 引用前一行值
- r - R中的变异和绘图
- delphi - Delphi Indy connect/disconnect 没有足够的内存资源来处理这个命令
- javascript - 如何通过 route.params tu react navigation 5组件?
- javascript - 从 Cloud Firestore 加载特定数量