Java+Selenium3方法篇23-iframe切换的问题

2024-06-11 12:32

本文主要是介绍Java+Selenium3方法篇23-iframe切换的问题,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

        这篇介绍webdriver在处理定位元素报错,提示没有这样的元素。这个时候,有可能是你测试的网页,采用了frame技术。什么是frame,简单来说,就是把一个网页划分成多个子页面,脑补这下这样的页面。我把一个空白的html文件,使用了frame技术后,分成两个页面,左边显示百度首页,右边显示谷歌首页。这个就是frame的简单使用。webdriver默认查找的元素都是Top window这层,如果有些元素内嵌在frame内部,需要先使用switch to语句,切换到frame内部,然后去操作元素,操作完了之后,需要switch out到default区域,也就是Top window。

       举例:网上不太好找一个网页使用了frame技术。我这里找到一个,主要点击下面这个页面中的筛选条件中的化学药这个元素。正常的测试步骤,如下,结果报错,提示没有这样的元素这个异常。

package lessons;import java.util.concurrent.TimeUnit;import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;public class ElementOpration {public static void main(String[] args) throws Exception {  System.setProperty("webdriver.chrome.driver", ".\\Tools\\chromedriver.exe");  WebDriver driver = new ChromeDriver();  driver.manage().window().maximize();  driver.manage().timeouts().implicitlyWait(5, TimeUnit.SECONDS);driver.get("http://data.pharmacodia.com/web/homePage/index?ns=1&ts=1&str=YWSJ");  Thread.sleep(1000);// 化学药 这个分类点击WebElement drug_type_huaxue = driver.findElement(By.xpath("//*/span[@title='化学药']"));drug_type_huaxue.click();}  
}
       从Eclipse上报错来看,提示没有这样的元素这个异常,一开始,可以去排查是不是我们元素定位方式写错了。第二个要考虑到就是,该页面是不是使用了frame技术。在firefox浏览器上的firepath插件,通过看下图中红圈确定元素是否在frame内部。

       正常的元素这个红圈位置会显示Top Window。如果看到了iframe说明这里采用了frame技术,一般来讲#后面的表示这个frame的id或者名称,webdriver中有一个方法是根据frame的名称或者id来进行切换的。switchTo下关于frame操作的有四个方法。

       第一个是根据frame的索引来定位,也就是说一个页面如果有多个frame,可以根据frame(1),frame(2)从上往下去定位。第二个就是我们今天介绍的方法,是根据frame的ID或者name去识别。第三个是根据该frame内部一个元素去识别,第四个就是从frame内部切换到默认的Top Window的方法。我们修改下脚本,在点击化学药这个操作的时候,先切换到frame内部,然后去操作内部元素化学药,最后切换出去,点击无权限提醒对话框上面的去登录按钮。

package lessons;import java.util.concurrent.TimeUnit;import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;public class ElementOpration {public static void main(String[] args) throws Exception {  System.setProperty("webdriver.chrome.driver", ".\\Tools\\chromedriver.exe");  WebDriver driver = new ChromeDriver();  driver.manage().window().maximize();  driver.manage().timeouts().implicitlyWait(5, TimeUnit.SECONDS);driver.get("http://data.pharmacodia.com/web/homePage/index?ns=1&ts=1&str=YWSJ");  Thread.sleep(1000);// 切换到某一个frame内部driver.switchTo().frame("rightMain");// 化学药 这个分类点击WebElement drug_type_huaxue = driver.findElement(By.xpath("//*/span[@title='化学药']"));drug_type_huaxue.click();Thread.sleep(1000);// 切换到Top Windows,点击权限提示上面的去登录按钮。driver.switchTo().defaultContent();driver.findElement(By.xpath("//*[@id='noLoginAlert']/div/button")).click();}  
}
        解释一下上面的测试过程,打开的一个页面,然后使用swithcTo方法,通过frame的名称为rightMain,从Top Window切换进入到frame内部,然后去查找化学药这个元素,随后去点击。在无权限弹窗中,去登陆这个元素是Top Window层的元素,所以点击之前,需要在rightMain这个frame切换出来,切换到Top Window层,才能正确找到去登录这个元素。

       使用frame技术的网页还是比较少见,我看了一般的电商网站都没有frame,如果有都是百度广告联盟的flash的广告,frame内部没有实际的元素可操作。所以,以后如果遇到你能肯定你的元素定位表达式没有写错,但是还是包No such element的异常,你就要考虑下是否使用了frame技术,如果是,就按本文演示的方式去处理就好。



这篇关于Java+Selenium3方法篇23-iframe切换的问题的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1051177

相关文章

Java的栈与队列实现代码解析

《Java的栈与队列实现代码解析》栈是常见的线性数据结构,栈的特点是以先进后出的形式,后进先出,先进后出,分为栈底和栈顶,栈应用于内存的分配,表达式求值,存储临时的数据和方法的调用等,本文给大家介绍J... 目录栈的概念(Stack)栈的实现代码队列(Queue)模拟实现队列(双链表实现)循环队列(循环数组

usb接口驱动异常问题常用解决方案

《usb接口驱动异常问题常用解决方案》当遇到USB接口驱动异常时,可以通过多种方法来解决,其中主要就包括重装USB控制器、禁用USB选择性暂停设置、更新或安装新的主板驱动等... usb接口驱动异常怎么办,USB接口驱动异常是常见问题,通常由驱动损坏、系统更新冲突、硬件故障或电源管理设置导致。以下是常用解决

Python实现图片分割的多种方法总结

《Python实现图片分割的多种方法总结》图片分割是图像处理中的一个重要任务,它的目标是将图像划分为多个区域或者对象,本文为大家整理了一些常用的分割方法,大家可以根据需求自行选择... 目录1. 基于传统图像处理的分割方法(1) 使用固定阈值分割图片(2) 自适应阈值分割(3) 使用图像边缘检测分割(4)

Java中Switch Case多个条件处理方法举例

《Java中SwitchCase多个条件处理方法举例》Java中switch语句用于根据变量值执行不同代码块,适用于多个条件的处理,:本文主要介绍Java中SwitchCase多个条件处理的相... 目录前言基本语法处理多个条件示例1:合并相同代码的多个case示例2:通过字符串合并多个case进阶用法使用

Java中的Lambda表达式及其应用小结

《Java中的Lambda表达式及其应用小结》Java中的Lambda表达式是一项极具创新性的特性,它使得Java代码更加简洁和高效,尤其是在集合操作和并行处理方面,:本文主要介绍Java中的La... 目录前言1. 什么是Lambda表达式?2. Lambda表达式的基本语法例子1:最简单的Lambda表

Java中Scanner的用法示例小结

《Java中Scanner的用法示例小结》有时候我们在编写代码的时候可能会使用输入和输出,那Java也有自己的输入和输出,今天我们来探究一下,对JavaScanner用法相关知识感兴趣的朋友一起看看吧... 目录前言一 输出二 输入Scanner的使用多组输入三 综合练习:猜数字游戏猜数字前言有时候我们在

Mysql如何解决死锁问题

《Mysql如何解决死锁问题》:本文主要介绍Mysql如何解决死锁问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录【一】mysql中锁分类和加锁情况【1】按锁的粒度分类全局锁表级锁行级锁【2】按锁的模式分类【二】加锁方式的影响因素【三】Mysql的死锁情况【1

Spring Security+JWT如何实现前后端分离权限控制

《SpringSecurity+JWT如何实现前后端分离权限控制》本篇将手把手教你用SpringSecurity+JWT搭建一套完整的登录认证与权限控制体系,具有很好的参考价值,希望对大家... 目录Spring Security+JWT实现前后端分离权限控制实战一、为什么要用 JWT?二、JWT 基本结构

java解析jwt中的payload的用法

《java解析jwt中的payload的用法》:本文主要介绍java解析jwt中的payload的用法,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Java解析jwt中的payload1. 使用 jjwt 库步骤 1:添加依赖步骤 2:解析 JWT2. 使用 N

springboot项目如何开启https服务

《springboot项目如何开启https服务》:本文主要介绍springboot项目如何开启https服务方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录springboot项目开启https服务1. 生成SSL证书密钥库使用keytool生成自签名证书将