掌握核心原理,轻松解决自动化测试的iframe定位问题
下图是你要定位的元素,其xpath路径为/html/body/div[2]/div[1]/table/tbody/tr[1]/td[2],我们在定位该元素的时候,如果直接使用xpath法来定位,是会提示NoSuchElement的,那该如何解决呢?
答案就是检查页面上是否有ifame嵌套,可以看到,浏览器的当前页面是有个iframe的
遇到这种iframe该如何操作呢?
(一)基本用法
1.首先找到iframe的定位
WebElement iframe=driver.findELement(By.xpath(“//*[@id="admin-body"]/div/div/div[2]/iframe”))
2.然后切换到iframe里面
driver.switchTo().frame(iframe);
3.定位目标元素
WebElement target=driver.findELement(By.xpath(“/html/body/div[2]/div[1]/table/tbody/tr[1]/td[2]”))
这就是iframe的基本使用方法。实际应用过程中,我们遇到的iframe的情况可能不是这么简单,但万变不离其宗,掌握核心原理即可熟练运用。
iframe切换的核心原理是:先切换到父级,再切换到子级。
- a:由父级切换到子级时:可直接切换
- b:由子级切换到父级时:必须先切换到defaultContent,然后再切换到父级
- c:同一个父级,不同子级之间切换时:组合上面两个步骤,先b再a
下面我们来具体理解一下:
(二)多个iframe嵌套
<html>
<....> ------------------------>A
<iframe id=”iframe1”>
<html>
<....> ------------------------>B
<iframe id=”iframe2”>
<html>
<....> ------------------------>C
</iframe>
</iframe>
<iframe id=”iframe3”>
<html>
<....> ------------------------>D
</iframe>
</html>
A是iframe框架外的元素
B是iframe1里面的元素
C是iframe2里面的元素
D是iframe3里面的元素
这种情况下,iframe1和iframe3的父级就是defaultContent;iframe2的父级就是iframe1,那如何在iframe1、2、3之间切换呢?
(1)由A切换到iframe1
driver.switchTo().frame(iframe1);
(2)由A切换到iframe2
driver.switchTo().frame(iframe1);
driver.switchTo().frame(iframe2);
(3)由A切换到iframe3
driver.switchTo().frame(iframe3);
(4)由iframe2切换到iframe1
driver.switchTo().defaultContent();
driver.switchTo().frame(iframe1);
(5)由iframe2切换到iframe3
driver.switchTo().defaultContent();
driver.switchTo().frame(iframe3);
(6)由iframe3切换到iframe1
driver.switchTo().defaultContent();
driver.switchTo().frame(iframe1);
(7)由iframe3切换到iframe2
driver.switchTo().defaultContent();
driver.switchTo().frame(iframe1);
driver.switchTo().frame(iframe2);
(8)由iframe1切换到iframe2
driver.switchTo().frame(iframe2);
(9)由iframe1切换到iframe3
driver.switchTo().defaultContent();
driver.switchTo().frame(iframe3);
(三)存在多个不同的iframe但页面只显现1个
<html>
<....>
<iframe id=”iframe1”> ===><iframe id=”iframe2”>
</iframe>
</html>
那如何在iframe1、2之间切换呢?
(1)由iframe2切换到iframe1
driver.switchTo().defaultContent();
driver.switchTo().frame(iframe1);
(2)由iframe1切换到iframe2
driver.switchTo().defaultContent();
driver.switchTo().frame(iframe2);
文章原创,以自己做自动化测试过程中遇到的问题及解决思路和步骤,供大家思考,以期抛砖引玉,共同进步和提高。