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

Python Selenium Webdriver:我可以切换到不友好的iframe吗?,python,selenium,selenium-webdriver,iframe,Python,Selenium,Selenium Webdriver,Iframe,当我尝试将_切换到_frame()或将_切换到.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:

当我尝试将_切换到_frame()或将_切换到.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)

(这是否意味着它仅在iFrame具有name属性时工作?

是的,您可以将
WebElement
传递给
switch_to.frame
函数,它将工作

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

self.\u切换到.window(窗口名称)

它需要一个窗口名或句柄,从而导致您在提供的回溯中出错

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


switch\u to\u frame
现已被弃用,请使用
switch\u to
进行任何切换功能

有关在窗口和框架之间切换的文档是,它指的是
切换到框架
,但描述仍然与使用目的相关


旁注

请将Chromedriver更新至至少
2.36
,因为您运行的是Chrome build 65,当前版本的Chromedriver
2.33


通过使它们保持最新,或在推荐的一对上,您将遇到较少的问题,如chromedriver下载登录页所述。

是的,您可以将
WebElement
传递到
切换到.frame
功能,它将工作

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

self.\u切换到.window(窗口名称)

它需要一个窗口名或句柄,从而导致您在提供的回溯中出错

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


switch\u to\u frame
现已被弃用,请使用
switch\u to
进行任何切换功能

有关在窗口和框架之间切换的文档是,它指的是
切换到框架
,但描述仍然与使用目的相关


旁注

请将Chromedriver更新至至少
2.36
,因为您运行的是Chrome build 65,当前版本的Chromedriver
2.33


通过保持这些更新,或者在推荐的一对上,如ChLSeMeLoad下载着陆页上所描述的那样,您将遇到更少的问题。

< P>在使用框架时,您需要考虑以下几件事情:

driver.switch_to.frame(frame_reference)

Returns : SwitchTo an object containing all options to switch focus into
  • 一个网页可以有多个框架
  • 所有帧可能没有不同的
    id
    名称
    等属性
  • 框架的加载顺序可能因您在中与之交互的WebElements而异
  • 某些IFAME可以将属性样式设置为显示:无
考虑到上述用例,您必须找出您想要切换到的预期
。因此,不要通过以下方式创建列表:

iframes = driver.find_elements_by_tag_name('iframe')
尝试通过以下方法之一找到要与之交互的预期WebElement所在的确切框架:

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
您可以在中找到详细的讨论

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

switch_to_frame(frame_reference)
Deprecated use driver.switch_to.frame
请按如下方式使用:

driver.switch_to.frame(frame_reference)

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

注意:要实现有效的帧切换,需要将with子句归纳为。你可以在副标题

中找到一个详细的讨论。在使用框架时,你需要考虑以下几个方面:

driver.switch_to.frame(frame_reference)

Returns : SwitchTo an object containing all options to switch focus into
  • 一个网页可以有多个框架
  • 所有帧可能没有不同的
    id
    名称
    等属性
  • 框架的加载顺序可能因您在中与之交互的WebElements而异
  • 某些IFAME可以将属性样式设置为显示:无
考虑到上述用例,您必须找出您想要切换到的预期
。因此,不要通过以下方式创建列表:

iframes = driver.find_elements_by_tag_name('iframe')
尝试通过以下方法之一找到要与之交互的预期WebElement所在的确切框架:

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
您可以在中找到详细的讨论

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

switch_to_frame(frame_reference)
Deprecated use driver.switch_to.frame
请按如下方式使用:

driver.switch_to.frame(frame_reference)

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

注意:要实现有效的帧切换,需要将with子句归纳为。您可以在副标题

下找到详细讨论,具体取决于您正在运行的selenium版本,
switch_to_frame
已被弃用。此外,请提供您遇到的异常的完整堆栈跟踪。通过移除
try/except
并让控制台打印异常,或者使用
traceback
并将
print traceback.format_exc()
放在
except
块井中,基于堆栈跟踪,您将获得它的输出。。。它似乎与您提供的代码示例不匹配。例如,stacktrace的第四行是:
驱动程序。将\u切换到\u窗口(ifr)
。另外,代码的最后一行似乎会导致无限循环,但我猜这只是示例中的一个格式错误。根据您运行的selenium版本,
switch_to_frame
不推荐使用。此外,请提供您遇到的异常的完整堆栈跟踪。您可以通过删除
try/except
并让控制台打印exc来获得它的输出