当框架没有id时如何识别并切换到selenium webdriver中的框架

Posted

技术标签:

【中文标题】当框架没有id时如何识别并切换到selenium webdriver中的框架【英文标题】:How to identify and switch to the frame in selenium webdriver when frame does not have id 【发布时间】:2013-12-02 21:34:27 【问题描述】:

谁能告诉我如何识别并切换到只有标题的 iframe?

<iframe frameborder="0" style="border: 0px none; width: 100%; height: 356px; min-width: 0px; min-height: 0px; overflow: auto;" dojoattachpoint="frame" title="Fill Quote" src="https://tssstrpms501.corp.trelleborg.com:12001/teamworks/process.lsw?zWorkflowState=1&zTaskId=4581&zResetContext=true&coachDebugTrace=none">

我试过下面的代码,但它不起作用

driver.switchTo().frame(driver.findElement(By.tagName("iframe")));

【问题讨论】:

一般来说,您可以像定位任何其他 WebElement 一样定位 iframe 对象。 XPath、CSS 选择器 【参考方案1】:

driver.switchTo().frame() 有多个重载。

    driver.switchTo().frame(name_or_id) 这里你的iframe 没有id 或名字,所以不适合你。

    driver.switchTo().frame(index) 这是最后一个选择,因为使用索引并不像你想象的那样稳定。如果这是页面中唯一的 iframe,请尝试 driver.switchTo().frame(0)

    driver.switchTo().frame(iframe_element) 最常见的一种。您可以像其他元素一样定位 iframe,然后将其传递给方法。

在这里通过title 属性找到它似乎是最好的。

driver.switchTo().frame(driver.findElement(By.cssSelector("iframe[title='Fill Quote']")));
// driver.switchTo().frame(driver.findElement(By.xpath(".//iframe[@title='Fill Quote']")));

【讨论】:

嗨,我正在使用 driver.switchTo().frame(driver.findElement(By.cssSelector("iframe[id='mobileNumber']")));并得到以下错误:无法找到元素:“method”:“css selector”,“selector”:“iframe[id='mobileNumber']” @ChanGan:逻辑看起来是正确的。但是,如果没有看到 html,我不可能知道定位器是否正确。您还为这个 iframe 使用过 WebDriverWait 吗? 不,我没有使用 WebDriverWait.. 当我使用 driver.switchTo().frame(0) 时它正在工作,但通过 iframe 逻辑中的这个元素不起作用。 @ChanGan:我明白了。在这种情况下,很可能是因为定位器。如果没有看到您的 HTML,我无法进一步评论。但是,如果索引有效并且您的应用程序不经常更改(因为 0 表示第一个),您可以坚持下去。 谢谢。你能确认一下这通常会起作用吗??? driver.switchTo().frame(driver.findElement(By.xpath(".//iframe[@title='Fill Quote']"))))【参考方案2】:

你可以使用cssSelector,

driver.switchTo().frame(driver.findElement(By.cssSelector("iframe[title='Fill Quote']")));

【讨论】:

【参考方案3】:

你也可以使用 src 切换到框架,这里是你可以使用的:

driver.switchTo().frame(driver.findElement(By.xpath(".//iframe[@src='https://tssstrpms501.corp.trelleborg.com:12001/teamworks/process.lsw?zWorkflowState=1&zTaskId=4581&zResetContext=true&coachDebugTrace=none']")));

【讨论】:

【参考方案4】:

确保在切换到框架之前切换到默认内容:

driver.switchTo().defaultContent();
driver.switchTo().frame(x);

x 可以是帧号,或者您可以使用driver.findlement 并使用您可用的任何选项,例如:driver.findElementByName("Name")

【讨论】:

【参考方案5】:

1) 转到 html 视图

2) 输入 iframe 并找到所需的帧并计算值并使用

oASelFW.driver.switchTo().frame(2); 

如果是第一帧,则使用oASelFW.driver.switchTo().frame(0);

如果是第二帧则分别使用oASelFW.driver.switchTo().frame(1);

【讨论】:

如果第二帧是内帧,索引是多少? @AshokkumarGanesan 如果内部框架是父框架中的第一个/唯一一个框架,它将是索引0【参考方案6】:

您可以使用 Css 选择器或 Xpath:

方法 1:CSS 选择器

driver.switchTo().frame(driver.findElement(By.cssSelector("iframe[title='Fill Quote']")));

方法 2:Xpath

driver.switchTo().frame(driver.findElement(By.xpath("//iframe[@title='Fill Quote']")));

https://seleniumatfingertips.wordpress.com/2016/07/05/handling-frames-in-selenium-webdriver-with-java/

【讨论】:

【参考方案7】:

最简单的方法是这样。如果它是一个框架,您可以右键单击该字段,如果您看到“在选项卡中打开框架”的选择,请执行此操作。

然后获取框架的 URL,这就是您使用“driver.get (http://blah blah..) 在 Python 脚本中输入的内容

然后 Selenium 可以找到您的命名元素。这节省了我尝试这里所有正在学习但没有奏效的建议的时间。我的问题是它在一个框架中。

我使用的是 Linux,它为我提供了在另一个选项卡中单独打开框架的右键单击选项。我不使用 Windows,所以不知道您是否会在右键菜单中获得该选项。

甘萨罗拉

【讨论】:

【参考方案8】:

我为此苦苦挣扎了一段时间;一个特别令人沮丧的网站在整个网站上有几个嵌套框架。我找不到任何方法来识别框架 - 没有名称、id、xpath、css 选择器 - 什么都没有。

最终我意识到帧的编号是顶层是 frame(0) 第二个 frame(1) 等等。

由于我仍然不知道我需要的元素位于哪一帧,我编写了一个 for 循环从 0 开始并循环到 50 不断移动到下一帧并尝试访问我需要的元素;如果它失败了,我让它打印一条消息并继续。

在这个问题上花了太多时间来解决这么简单的问题-_-

driver.switch_to.default_content()
for x in range(50):
    try:
        driver.switch_to.frame(x)
        driver.find_element_by_xpath("//*[@id='23']").click()
        driver.find_element_by_xpath("/html/body/form/table/tbody/tr[1]/td/ul/li[49]/a").click()
    except:
        print("It's not: ", x)
        continue

【讨论】:

开发者的设计听起来很糟糕【参考方案9】:

切换到框架的三种方式

1)Can use id
2)Can use name of the frame
3)Can use WebElement of the frame

2->driver.switchTo().frame("name of the frame");

【讨论】:

【参考方案10】:

我想我可以在这里添加一些东西。

我面临的情况

    我不能或不容易使用调试工具或检查工具(如 firebug)来查看我当前处于哪个框架并想转到哪个框架。

    检查工具告诉我的 XPATH/CSS 选择器等不起作用,因为当前帧不是目标帧。例如我需要先切换到子框架才能从 XPATH 或任何其他参考中访问/定位元素。

简而言之,find_element()find_elements() 方法不适用于我的情况。

等等等等!不完全是

除非我们使用一些 fazzy 搜索方法。

使用find_elements()contains(@id,"frame") 过滤掉潜在的

例如

driver.find_elements(By.XPATH,'//*[contains(@id,"frame")]')

然后使用switchTo() 切换到该框架,希望这次可以访问目标元素的底层XPATH。

如果你和我一样倒霉,可能需要对找到的帧进行迭代,甚至在更多层中进行更深的迭代。

例如 这是我用的那块。

try:
    elf1 = mydriver.find_elements(By.XPATH,'//*[contains(@id,"rame")]')
    mydriver.switch_to_frame(elf1[1])
    elf2 = mydriver.find_elements(By.XPATH,'//*[contains(@id,"rame")]')
    mydriver.switch_to_frame(elf2[2])
    len(mydriver.page_source) ## size of source tell whether I am in the right frame 

我尝试了不同的switch_to_frame(elf1[x])/switch_to_frame(elf2[x])组合,最后通过我从浏览器的检查工具中找到的XPATH找到了想要的元素。

try:
    element = WebDriverWait(mydriver, 10).until(
        EC.presence_of_element_located((By.XPATH, '//*[@id="C4_W16_V17_ZSRV-HOME"]'))
        )
    #Click the link
    element.click()

【讨论】:

【参考方案11】:

我可以用下面的代码解决这个问题

browser.switch_to.frame(browser.find_element_by_tag_name('iframe'))

【讨论】:

以上是关于当框架没有id时如何识别并切换到selenium webdriver中的框架的主要内容,如果未能解决你的问题,请参考以下文章

python+selenium2自动化---多表单多窗口切换

python+selenium:iframe框架中动态id如何切换

Selenium 如何切换到 iframe 内联页面

selenium 框架切换iframe报错NoSuchFrameException的解决方法

Python Selenium:如何等待并切换到动态 iframe?

单击按钮后使用 Selenium 切换到新窗口