【问题标题】:How to identify and switch to the frame in selenium webdriver when frame does not have id当框架没有id时如何识别并切换到selenium webdriver中的框架
【发布时间】: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 选择器

标签: testing selenium selenium-webdriver


【解决方案1】:

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

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

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

  3. 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】:

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

              我面临的情况

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

              2. 检查工具告诉我的 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'))
                

                【讨论】:

                  猜你喜欢
                  • 2015-02-08
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2013-07-03
                  • 1970-01-01
                  • 1970-01-01
                  相关资源
                  最近更新 更多