python - 如何切换到 iframe 窗口?
问题描述
我正在尝试单击 iframe 弹出窗口,但无法获得焦点。
这是弹出窗口和我要单击的按钮:
这是我到目前为止的代码:
patsearch = driver.find_element_by_xpath('//*[@id="command_idSearchButton"]/nobr').click()
time.sleep(5)
iframe = driver.find_element_by_xpath('//*[@id="iframe_52"]')
driver.switch_to.frame(iframe)
mrn = WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, '//*[@id="control_15"]'))).send_keys(mrnum)
time.sleep(1)
ln = WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, '//*[@id="control_18"]'))).send_keys(last_name)
time.sleep(1)
fn = WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, '//*[@id="control_19"]'))).send_keys(first_name)
time.sleep(1)
search = WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, '//*[@id="control_66"]'))).click()
#try: click patient if one exists / try warning pop alert / exception warning / exception nopatient exists wrtie to file
try:
WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, '//*[@id="idHTMLResult"]/table/tbody/tr[2]/td[4]/a'))).click()
try:
print('trying to switch..')
WebDriverWait(driver, 20).until(EC.frame_to_be_available_and_switch_to_it((By.ID, "frame_116")))
print('switched')
WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, '//*[@id="control_8"]')))
driver.switch_to_default_content()
except TimeoutException:
print('didnt switch...')
这是HTML:
解决方案:
iframe = driver.find_element_by_xpath('//*[@id="iframe_52"]')
driver.switch_to.frame(iframe)
#do something
#try: click account if one exists / try warning pop alert / exception warning / exception no account exists write to file
try:
WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, '//*[@id="idHTMLResult"]/table/tbody/tr[2]/td[4]/a'))).click()
try:
driver.switch_to_default_content()
print('trying to switch..')
WebDriverWait(driver, 20).until(EC.frame_to_be_available_and_switch_to_it((By.ID, "frame_116")))
print('switched')
WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.XPATH, '//*[@id="control_8"]'))).click()
driver.switch_to_default_content()
except:
driver.switch_to.frame(iframe)
解决方案
使用显式等待定位iframe
并切换到它:
from selenium.webdriver.support import ui
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
ui.WebDriverWait(driver, 10).until(EC.frame_to_be_available_and_switch_to_it((By.ID, "frame_116")))
PS:此代码将替换以下行:
warning = driver.find_element_by_xpath('//*[@id="frame_116"]')
driver.switch_to_frame(warning)
希望对你有帮助!
推荐阅读
- spring-boot - 为什么在测试类中设置的 spring.profiles.active 在实际测试类的环境属性中不可用?
- thymeleaf - 如何百里香选择行值参数jquery函数?
- python - 在Django中删除后获取用户电子邮件
- events - KafkaJS / MS 事件中心 - 使用 eachBatch 时偏移损坏
- thingsboard - Thingsboard 小部件上的实际数据可视化问题
- javascript - 是否可以在 GTM 自定义模板中获取 DOM 元素?
- jdbc - Informix JDBC 驱动程序连接:表已被删除、更改或重命名
- java - Java:使用while循环改变行的顺序
- python - 使用 Rsync 从 EC2 自动备份到 NAS
- spyder - 执行前重启 spyder ipython 控制台