我有这样的代码。
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
的值?
我想确保在做某事之前处理正确的框架。
答案 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
中是否存在元素。