Python Selenium Webdriver:我可以切换到不友好的iframe吗?

时间:2018-04-03 22:39:34

标签: python selenium selenium-webdriver iframe

当我尝试将switch_to_frame()或switch_to.frame()(顺便说一句,哪些是正确的?)转换为不友好的iFrame时,我收到错误。应该支持吗?

def click_all(driver):
    for img in imgs:
        img.click()
    iframes = driver.find_elements_by_tag_name('iframe')
    for ifr in iframes:
        try:
            driver.switch_to.frame(ifr)
        except:
            e = sys.exc_info()
            print "Error: %s" % str(e) # Gives a vague error: '(<class 'selenium.common.exceptions.WebDriverException'>, WebDriverException(), <traceback object at 0x1102a9680>)'
            return
        click_all(driver)

感谢您的帮助!

堆栈跟踪是:

Traceback (most recent call last):
File "/Users/merrigan/working/DockLion/qe-cordell/test/bases/util.py", 
line 45, in click_all
driver.switch_to_window(ifr)
File "/Library/Python/2.7/site-packages/selenium/webdriver/remote/webdriver.py", line 657, in switch_to_window
self._switch_to.window(window_name)
File "/Library/Python/2.7/site-packages/selenium/webdriver/remote/switch_to.py", line 113, in window
self._driver.execute(Command.SWITCH_TO_WINDOW, data)
File "/Library/Python/2.7/site-packages/selenium/webdriver/remote/webdriver.py", line 308, in execute
self.error_handler.check_response(response)
File "/Library/Python/2.7/site-packages/selenium/webdriver/remote/errorhandler.py", line 194, in 
check_response
raise exception_class(message, screen, stacktrace)
WebDriverException: Message: unknown error: 'name' must be a string
(Session info: chrome=65.0.3325.181)
(Driver info: chromedriver=2.33.506106 
(8a06c39c4582fbfbab6966dbb1c38a9173bfb1a2),platform=Mac OS X 10.12.6 x86_64)

(这是否意味着只有iFrame具有名称属性才有效?)

2 个答案:

答案 0 :(得分:1)

是的,您可以将WebElement传递给switch_to.frame功能,它会起作用。

离。

 driver.switch_to.frame(driver.find_element_by_id('id'))

您上面遇到的问题是由上面的代码中没有的这一行引起的:

  

self._switch_to.window(window_name)

这需要一个窗口名称句柄,从而导致您在提供的回溯中出现错误。

如果您仍然遇到问题,请提供相关的 HTML ,以便我们帮助您切换到此框架。

switch_to_frame现已弃用,请使用switch_to进行任何切换功能。

在窗口和框架之间切换的文档为HERE,引用switch_to_frame,但说明仍然与使用相关。

<强>旁注

请将您的 Chromedriver 更新为至少 2.36,因为您运行 Chrome内容版本65 ,但不支持您当前版本的 Chromedriver 2.33https://sites.google.com/a/chromium.org/chromedriver/downloads

通过保持最新状态或推荐配对,您将遇到更少的问题,如chromedriver下载登录页面所述。

答案 1 :(得分:1)

使用框架时,您需要考虑以下几点:

  • 网页可以有多个框架。
  • 所有框架可能没有不同的idnameclass等属性。
  • 框架的加载顺序可能因您在Top-Level Browsing Context
  • 中与之互动的 WebElements 而有所不同
  • 某些ifames可以将 style 属性设置为 display:none;

要查看上述用例,您必须找出要切换的目标<iframe>。因此,而不是通过以下方式创建列表:

iframes = driver.find_elements_by_tag_name('iframe')

尝试通过以下任一方法找到您希望与之交互的 WebElements 所在的确切框架:

driver.switch_to.frame("iframe_name") # By Frame Name
driver.switch_to.frame("iframe_id") # By Frame ID
driver.switch_to.frame(frame_index) # By Frame Index

您可以在How can I select a html element no matter what frame it is in in selenium?

中找到详细的讨论

API文档明确提到switch_to_frame()方法已弃用

switch_to_frame(frame_reference)
Deprecated use driver.switch_to.frame

使用switch_to.frame()代替如下:

driver.switch_to.frame(frame_reference)

Returns : SwitchTo an object containing all options to switch focus into

注意:要进行有效的帧切换,您需要将WebDriverWait expected_conditions子句引为frame_to_be_available_and_switch_to_it()。您可以在小标题A Better Approach to Switch Frames

下找到详细的讨论