【问题标题】:Python Selenium Webdriver: Can I switch to an unfriendly iframe?Python Selenium Webdriver:我可以切换到不友好的 iframe 吗?
【发布时间】:2018-04-03 22:39:34
【问题描述】:

当我尝试将 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 具有 name 属性时才有效?)

【问题讨论】:

  • 根据您运行的 selenium 版本,switch_to_frame 已被弃用。另外,请提供您遇到的异常的完整堆栈跟踪。您可以通过删除try/except 并让控制台打印异常,或使用traceback 并将print traceback.format_exc() 放入您的except 块中来获得它的输出
  • 好吧,根据堆栈跟踪...它似乎与您提供的代码示例不匹配。例如,stacktrace 的第 4 行是:driver.switch_to_window(ifr)。此外,您的代码的最后一行似乎导致了无限循环,但我猜这只是您的示例的格式错误。

标签: python selenium selenium-webdriver iframe


【解决方案1】:

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

例如

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

您在上面遇到的问题是由您上面的代码中不存在的这一行引起的:

self._switch_to.window(window_name)

这需要一个窗口 namehandle,从而导致您在提供的 Traceback 中出错。

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


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

windows和frames切换的文档是HERE,指的是switch_to_frame,但是说明还是有使用目的的。


旁注

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

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

【讨论】:

  • 从他的代码示例可以看出,他正在将WebElement 传递给switch_to 函数,所以这不是问题所在。您的其余答案是关于他的代码与回溯不匹配,这已经在他的帖子的评论中指出。这个答案根本没有提供任何答案,更适合发表评论。
  • 他直接询问是否应该支持,所以我确实在回答他提出的所有问题。他还在底部询问是否只能通过名称切换。如果您对答案不满意。请自己回答。
  • 您在他的标题中回答了“我可以切换到不友好的 iframe”中的问题,在这种情况下,答案是肯定的。还有一个关于哪种方法合适的附带问题。但他的问题表明他已经尝试了这两种方法并且在尝试这样做时遇到了错误,这就是他在这里试图寻求帮助的原因。你提供的例子就是他已经说过他正在尝试做的事情。然而,他的回溯显示他正在运行的代码与他提供的代码不同,这就是问题所在。所以,如前所述,目前还没有办法提供答案。
  • 谢谢,事实证明更新 Chrome 驱动程序消除了错误。感谢@crookedleaf 推荐使用回溯。测试框架对我隐藏了堆栈跟踪,所以这非常有帮助。
【解决方案2】:

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

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

考虑到上述用例,您必须找出要切换到的预期&lt;iframe&gt;。因此,不要通过以下方式创建列表:

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 Docs 明确提到 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

注意:为了有效的帧切换,您需要将WebDriverWaitexpected_conditions 子句诱导为frame_to_be_available_and_switch_to_it()。您可以在子标题A Better Approach to Switch Frames

下找到详细讨论

【讨论】:

    猜你喜欢
    • 2017-12-24
    • 2017-05-06
    • 1970-01-01
    • 2014-06-11
    • 2018-07-22
    • 2013-06-04
    • 2017-12-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多