【问题标题】:Do Frames/iFrames always have ID attributeFrames/iFrames 是否总是有 ID 属性
【发布时间】:2017-10-16 17:23:59
【问题描述】:

我正在尝试使用 selenium(java) 自动化网页。

我正在开发一种自动化工具,可以使用它来监视和保存WebElement。这些保存的 webobjects 可用于稍后执行某些操作。 当监视WebElement 时,我将获得(x,y) 坐标,我将使用该坐标执行以下返回WebElement 的脚本:

webObject = (WebElement) driver.executeScript(String.format("return document.elementFromPoint(%s, %s);",new Object[] { x, y }), new Object[0]);

如果(x,y) 位于不同的框架上,此脚本将返回WebElement 中的Frame,可用于切换驱动程序。我继续执行相同的脚本,直到我得到不是FrameWebElement。在保存它的同时,我保存了相对于当前Frame 的 xPath 和我目前已切换的帧的 ID。

稍后,在执行某些操作时,我会根据 Frames 和 xPath 的 ID 找到 WebElement

那么,开发人员是否有遵循惯例/标准来始终为 frame/iframe 创建 ID 属性?如果这不是真的,我可以依赖哪些其他属性?

【问题讨论】:

  • id 是可选的。目前还不清楚你真正想要做什么以及基于什么......

标签: java html selenium iframe


【解决方案1】:

有几种方法可以使用 Selenium WebDriver 来处理 frame/iframe。您可以参考下面的stackoverflow 问题以进一步了解使用Selenium WebDriver 处理iframe:

How to identify and switch to the frame in selenium webdriver when frame does not have id

【讨论】:

    【解决方案2】:

    根据最佳实践,每个帧都应指定 ID 和 Name 属性。但在实时场景中,有时会观察到框架的 ID/名称在当前 HTML DOM 中不直接可见。

    切换到帧

    我们可以通过3种方式切换到帧。

    按帧名称:

    iframe的Name属性,我们可以通过它切换到它。

    例子:

    driver.switchTo().frame("name_of_frame");
    

    按帧 ID:

    iframe的ID属性,我们可以通过它切换到它。

    例子:

    driver.switchTo().frame("id_of_frame");
    

    按索引:

    假设页面有100帧,我们可以通过索引切换到iframe。

    例子:

    driver.switchTo().frame(0);
    driver.switchTo().frame(1);
    

    切换回主框架:

    我们可以使用defaultContent切换回主框架。

    例子:

    driver.switchTo().defaultContent();
    

    如果这能回答您的问题,请告诉我。

    【讨论】:

    • 我认为index取决于frame的加载方式,所以下次打开同一个网页时,某个frame的index可能会发生变化。通过这个我无法保存索引来切换帧。如果假设网页既没有 ID 也没有名称属性,我可以保存哪些其他属性,或者您能建议如何在任何情况下定位框架。
    • IMO,帧的加载取决于编写的代码,因此除非代码更改,否则帧的顺序将相同。如果此答案符合您的问题,您能否接受该答案作为您问题的解决方案?谢谢
    猜你喜欢
    • 2019-04-12
    • 2011-02-05
    • 1970-01-01
    • 2017-12-30
    • 2016-01-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多