Python Selenium:如何在导航后切换框架?
Python Selenium: how to switch frames after navigation?
在使用 Python3 + selenium 导航到一个页面后,我正在尝试在 table 中下载 link。在使用 selenium 单击 links 并检查最新加载页面上的元素后,我可以看到我的元素位于名为 "contents" 的框架内。但是,当我尝试访问此框架时,在调用时:
DRIVER.switch_to_frame("contents")
我收到以下错误:
selenium.common.exceptions.NoSuchFrameException: Message: contents
为了获得更多背景信息,我进行了一项实验。我使用 DRIVER.get(URL) 加载的页面和我导航到的页面都有一个名为 "menu".
的框架
我可以在第一页调用 DRIVER.switch_to_frame("menu"),但不能在第二页调用。
DRIVER = webdriver.Chrome(CHROME_DRIVER)
DRIVER.get(SITE_URL)
DRIVER.switch_to_frame("contents") # This works
target_element = DRIVER.find_element_by_name(LINK)
target_element.click()
time.sleep(5)
DRIVER.switch_to_frame("menu")
target_element = DRIVER.find_element_by_name(LINK2)
target_element.click()
target_element = DRIVER.find_element_by_name(LINK3)
target_element.click()
DRIVER.switch_to_frame("contents") # Code breaks here.
target_element = DRIVER.find_element_by_xpath(REF)
target_element.click()
print("Program complete.")
我希望代码在 "contents" 框架中找到 link 的 xpath 引用。相反,当尝试切换到 "contents" 框架时,python 运行-time errors and cannot find "contents".
由于内容似乎是顶级框架,请在选择框架之前尝试返回顶部:
DRIVER.switch_to.default_content()
DRIVER.switch_to.frame("contents")
selenium.common.exceptions.NoSuchFrameException: Message: contents
这是因为您停留在 iframe 的子级 'menu' 中,因此无法找到 iframe 'contents'。
首先使用
切换回"contents"的父框架
DRIVER.switch_to.default_content()
然后尝试转到 'contents' iframe 并执行操作,现在应该可以了。
根据经验法则,每当切换框架时,您需要为 frame_to_be_available_and_switch_to_it()
引入 WebDriverWait,并且您需要:
- 诱导 WebDriverWait 以获得所需的 框架并切换到它。
- 诱导 WebDriverWait 使所需的 元素可点击。
您可以使用以下解决方案:
target_element.click()
WebDriverWait(driver, 20).until(EC.frame_to_be_available_and_switch_to_it((By.XPATH,"frame_xpath")))
WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "REF"))).click()
你可以在
中找到关于帧切换的详细讨论
Here you can find a relevant discussion on
在使用 Python3 + selenium 导航到一个页面后,我正在尝试在 table 中下载 link。在使用 selenium 单击 links 并检查最新加载页面上的元素后,我可以看到我的元素位于名为 "contents" 的框架内。但是,当我尝试访问此框架时,在调用时:
DRIVER.switch_to_frame("contents")
我收到以下错误:
selenium.common.exceptions.NoSuchFrameException: Message: contents
为了获得更多背景信息,我进行了一项实验。我使用 DRIVER.get(URL) 加载的页面和我导航到的页面都有一个名为 "menu".
的框架
我可以在第一页调用 DRIVER.switch_to_frame("menu"),但不能在第二页调用。
DRIVER = webdriver.Chrome(CHROME_DRIVER)
DRIVER.get(SITE_URL)
DRIVER.switch_to_frame("contents") # This works
target_element = DRIVER.find_element_by_name(LINK)
target_element.click()
time.sleep(5)
DRIVER.switch_to_frame("menu")
target_element = DRIVER.find_element_by_name(LINK2)
target_element.click()
target_element = DRIVER.find_element_by_name(LINK3)
target_element.click()
DRIVER.switch_to_frame("contents") # Code breaks here.
target_element = DRIVER.find_element_by_xpath(REF)
target_element.click()
print("Program complete.")
我希望代码在 "contents" 框架中找到 link 的 xpath 引用。相反,当尝试切换到 "contents" 框架时,python 运行-time errors and cannot find "contents".
由于内容似乎是顶级框架,请在选择框架之前尝试返回顶部:
DRIVER.switch_to.default_content()
DRIVER.switch_to.frame("contents")
selenium.common.exceptions.NoSuchFrameException: Message: contents
这是因为您停留在 iframe 的子级 'menu' 中,因此无法找到 iframe 'contents'。
首先使用
切换回"contents"的父框架DRIVER.switch_to.default_content()
然后尝试转到 'contents' iframe 并执行操作,现在应该可以了。
根据经验法则,每当切换框架时,您需要为 frame_to_be_available_and_switch_to_it()
引入 WebDriverWait,并且您需要:
- 诱导 WebDriverWait 以获得所需的 框架并切换到它。
- 诱导 WebDriverWait 使所需的 元素可点击。
您可以使用以下解决方案:
target_element.click() WebDriverWait(driver, 20).until(EC.frame_to_be_available_and_switch_to_it((By.XPATH,"frame_xpath"))) WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "REF"))).click()
你可以在
中找到关于帧切换的详细讨论
Here you can find a relevant discussion on