如何用selenium-webdriver了解当前框架

时间:2014-05-01 13:27:31

标签: ruby selenium-webdriver

我有这样的代码。

require 'selenium-webdriver'
driver = Selenium::WebDriver.for :firefox
f = driver.find_element :xpath, "html/frameset//frame[@name='header']"
driver.switch_to.frame f

切换帧后,有没有办法访问当前帧的属性? 换句话说,切换后如何获取name标记的属性frame的值?

我想确保在做某事之前处理正确的框架。

2 个答案:

答案 0 :(得分:4)

这是在2012年正式要求和拒绝,在这里:

https://code.google.com/p/selenium/issues/detail?id=4305

回答者声称这被拒绝了,因为您可以使用此(Java)代码来完成同样的事情:

WebElement el = (WebElement) ((JavascriptExecutor) driver).executeScript("return window.frameElement");

就个人而言,这对我来说是一个愚蠢的答案 - Selenium的整个JavascriptExecutor部分似乎是一个丑陋的黑客行为,允许最终用户做一些开发人员预计不需要做的事情。除了开发人员明确告知这需要完成,他们忽略了它。

无论如何,我正在使用Python,它允许将其他方法动态添加到现有类(甚至是那些你无法访问的类),所以我只是使用以下内容为WebDriver提供currentFrame方法:

from selenium.webdriver.remote.webdriver import WebDriver

def currentFrame(self):
    return str(self.execute_script("""
        var frame = window.frameElement;
        if (!frame) {
            return 'root of window named ' + document.title;
        }
        var ret   = '<' + frame.tagName;
        if (frame.name) {
            ret += ' name=' + frame.name;
        }
        if (frame.id) {
            ret += ' id=' + frame.id;
        }
        return ret + '>';
        """))

WebDriver.currentFrame = currentFrame

(我只是将它用于调试/日志记录 - 我实际上并不需要WebElement所以我只是返回一个字符串。我不知道Ruby,但我相信你可以采用我的Python代码或我从其他网站复制的Java代码,使其在Ruby中工作。)

答案 1 :(得分:1)

我认为您无法访问当前iframe所属的属性。

我建议测试iframe中是否存在元素。