当框架没有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报错NoSuchFrameException的解决方法