10. selenium API (二)

目录

1. 多层框架/窗口定位

2. 下拉框处理

2.1 前端界面

2.2 代码

 3. 针对 alert 弹窗进行操作

3.1 前端界面

3.2 代码

4. 文件提交

4.1 前端界面

4.2 代码 

5. 显示等待

6. 操作浏览器滚动条

7. 截图

8. 浏览器关闭

9. 窗口切换


在上篇文章中,我们学习了 selenium 的一部分 API ,接下来我们将继续学习 selenium 的其他 API。

1. 多层框架/窗口定位

运行以下代码:

<html>
<head>
    <meta http-equiv="content-type" content="text/html;charset=utf-8" />
    <title>frame</title>
    <link href="http://netdna.bootstrapcdn.com/twitter-bootstrap/2.3.2/css/bootstrap-combined.min.css" rel="stylesheet" />
    <script type="text/javascript">$(document).ready(function(){
    });
    </script>
</head>
<body>
<div class="row-fluid">
    <div class="span10 well">
        <h3>frame</h3>
        <iframe id="f1" src="inner.html" width="800", height="600">
            #document
            <html>
            <head>
                <meta http-equiv="content-type" content="text/html;charset=utf-8" />
                <title>inner</title>
            </head>
            <body>
            <div class="row-fluid">
                <div class="span6 well">
                    <h3>inner</h3>
                    <iframe id="f2" src="http://www.baidu.com" width="700"height="500"></iframe>
                    <a href="javascript:alert('watir-webdriver better thanselenium webdriver;')">click</a>
                </div>
            </div>
            </body>
            </html>
        </iframe>
    </div>
</div>
</body>
<script src="http://netdna.bootstrapcdn.com/twitter-bootstrap/2.3.2/js/bootstrap.min.js"></script>
</html>

在展示的界面中,点击“click”,弹出如下图所示的对话框: 

那么,对于以上的多层框架,我们如何进行操作呢?

private static void page02() {
        // 创建浏览器驱动
        ChromeOptions options = new ChromeOptions();
        options.addArguments("--remote-allow-origins=*");
        WebDriver webDriver = new ChromeDriver(options);
        // 打开网页
        webDriver.get("http://localhost:63342/TestCode/src/main/Page/test02.html?_ijt=bl946c4l1esjbgi09kpv3kfull");
        // 找到 click 元素点击
        webDriver.switchTo().frame("f1");
        webDriver.findElement(By.cssSelector("body > div > div > a")).click(); // click 元素属于 f1
    }

运行以上代码后,可以看到自动选择了 f1 点击了 click 按钮,并弹出了对话框。

2. 下拉框处理

2.1 前端界面

<html>
<body>
<select id="ShippingMethod"
onchange="updateShipping(options[selectedIndex]);" name="ShippingMethod">
<option value="12.51">UPS Next Day Air ==> $12.51</option>
<option value="11.61">UPS Next Day Air Saver ==> $11.61</option>
<option value="10.69">UPS 3 Day Select ==> $10.69</option>
<option value="9.03">UPS 2nd Day Air ==> $9.03</option>
<option value="8.34">UPS Ground ==> $8.34</option>
<option value="9.25">USPS Priority Mail Insured ==> $9.25</option>
<option value="7.45">USPS Priority Mail ==> $7.45</option>
<option value="3.20" selected="">USPS First Class ==> $3.20</option>
</select>
</body>
</html>

如下图所示:

2.2 代码

我们根据 Value 来进行选择:

代码如下: 

private static void page03() {
        // 创建浏览器驱动
        WebDriver webDriver = new ChromeDriver();
        // 打开网页
        webDriver.get("http://localhost:63342/TestCode/src/main/Page/test03.html?_ijt=446o7rpogvt1o4i9oujv9j6tcg&_ij_reload=RELOAD_ON_SAVE");
        // 操作下拉框
        Select select = new Select(webDriver.findElement(By.cssSelector("#ShippingMethod")));
        // 通过 Value 进行修改
//        select.selectByValue("12.51");
        // 通过 Index 进行修改
        select.selectByIndex(2);
    }

 3. 针对 alert 弹窗进行操作

针对一个普通的 alert 的弹窗的操作有:确定、取消、输入。

3.1 前端界面

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<button onclick="Click()">这是一个弹窗</button>
</body>
<script type="text/javascript">
  function Click() {
    let name = prompt("请输入姓名:");
    let parent = document.querySelector("body");
    let child = document.createElement("div");
    child.innerHTML = name;
    parent.appendChild(child)
  }
</script>
</html>

3.2 代码

private static void page04() throws InterruptedException {
        WebDriver webDriver = new ChromeDriver();
        webDriver.get("http://localhost:63342/TestCode/src/main/Page/test04.html?_ijt=qndlcui1g1leqr5le5ehehn2hm&_ij_reload=RELOAD_ON_SAVE");
        webDriver.findElement(By.cssSelector("button")).click();
        sleep(3000);
//        // alert 弹窗确定
//        webDriver.switchTo().alert().accept();
//        // alert 弹窗取消
//        webDriver.switchTo().alert().dismiss();
        // alert 弹窗输入
        webDriver.switchTo().alert().sendKeys("你好");
        webDriver.switchTo().alert().accept();
    }

4. 文件提交

4.1 前端界面

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<input type="file">
</body>
</html>

4.2 代码 

 private static void page05() {
        WebDriver webDriver = new ChromeDriver();
        webDriver.get("http://localhost:63342/TestCode/src/main/Page/test05.html?_ijt=jm7pqiancl1i3ktkuciodrk1dl&_ij_reload=RELOAD_ON_SAVE");
        // 找到按钮(上传文件的按钮),输入一个字符串
        webDriver.findElement(By.cssSelector("input")).sendKeys("D:\\CSDN\\cat.jpg");
    }

以下内容为补充内容!!! 

5. 显示等待

显示等待和隐式等待,表示最多等待输入的时间,如果找到了对应元素则直接执行后续代码,不再强制等待,即显示等待和隐式等待都是智能等待;不同点:隐式等待等待的是页面上的所有元素,显示等待等待条件满足即可

    private static void test13() throws InterruptedException {
        WebDriver webDriver = new ChromeDriver();
//        webDriver.get("http://www.baidu.com/");
        webDriver.get("http://localhost:63342/TestCode/src/main/Page/test02.html?_ijt=7f6liucvphpe698jjd88202qv0&_ij_reload=RELOAD_ON_SAVE");
        sleep(3000);
        WebDriverWait webDriverWait = new WebDriverWait(webDriver,50);
//        webDriverWait.until(ExpectedConditions.titleIs("百度一下,你就知道"));
        webDriverWait.until(ExpectedConditions.textToBe(By.cssSelector("hs"),"frame"));
    }

6. 操作浏览器滚动条

private static void test14() throws InterruptedException {
        WebDriver webDriver = new ChromeDriver();
        webDriver.get("http://www.baidu.com/");
        // 在搜索框输入”软件“
        webDriver.findElement(By.cssSelector("#kw")).sendKeys("软件");
        // 点解”百度一下"按钮
        webDriver.findElement(By.cssSelector("#su")).click();
        sleep(3000);
        // 滚动条滚动到最下端
        ((JavascriptExecutor)webDriver).executeScript("document.documentElement.scrollTop=10000;");
    }

7. 截图

添加依赖:https://mvnrepository.com/artifact/commons-io/commons-io/2.4

将以上依赖添加到 pom.xml 中: 

private static void test15() throws IOException, InterruptedException {
        WebDriver webDriver = new ChromeDriver();
        webDriver.get("http://localhost:63342/TestCode/src/main/Page/test02.html?_ijt=7f6liucvphpe698jjd88202qv0&_ij_reload=RELOAD_ON_SAVE");
        sleep(5000);
        // 强制类型转换
        File src_file = ((TakesScreenshot)webDriver).getScreenshotAs(OutputType.FILE);
        // 将截图复制到指定的文件路径下,并命名为:jietu.png
        FileUtils.copyFile(src_file,new File("D:\\CSDN\\jietu.png"));
    }

8. 浏览器关闭

private static void test14() throws InterruptedException {
        WebDriver webDriver = new ChromeDriver();
        webDriver.get("http://www.baidu.com/");
        // 在搜索框输入”软件“
        webDriver.findElement(By.cssSelector("#kw")).sendKeys("软件");
        // 点解”百度一下"按钮
        webDriver.findElement(By.cssSelector("#su")).click();
        sleep(3000);
        // 滚动条滚动到最下端
        ((JavascriptExecutor)webDriver).executeScript("document.documentElement.scrollTop=10000;");
        // 关闭浏览器
        webDriver.quit();
    }

quit 相当于直接点击了右上角进行关闭。

    private static void test16() {
        WebDriver webDriver = new ChromeDriver();
        webDriver.get("http://www.baidu.com/");
        webDriver.findElement(By.cssSelector("#s-top-left > a:nth-child(1)")).click();
        // 关闭浏览器
        webDriver.close();
    }

close 关闭的是当前页面;quit 关闭的是浏览器,同时会删除网站的 cookie。

9. 窗口切换

private static void test17() {
        WebDriver webDriver = new ChromeDriver();
        webDriver.get("http://www.baidu.com/");
        webDriver.findElement(By.cssSelector("#s-top-left > a:nth-child(1)")).click();
        // 获取到浏览器所有的窗口句柄
        Set<String> handles = webDriver.getWindowHandles();
        String target_handle = "";
        for(String handle:handles){
            target_handle = handle;
        }
        // 窗口切换
        webDriver.switchTo().window(target_handle);
        webDriver.findElement(By.cssSelector("#header-link-wrapper > li:nth-child(5) > a")).click();
    }

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/102121.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Django请求的生命周期

Django请求的生命周期是指: 当用户在浏览器上输入URL到用户看到网页的这个时间段内&#xff0c;Django后台所发生的事情。 直白的来说就是当请求来的时候和请求走的阶段中&#xff0c;Django的执行轨迹。 一个完整的Django生命周期: 用户从客户端发出一条请求以后&#xff…

css3英文文字换行,超过两行...展示

需求&#xff1a;超过两行...展示 开发的过程中发现div内容中文可以换行英文不换行&#xff0c;导致长度会溢出。 是英文全英文的话浏览器会解析成一个单词&#xff0c; 加上这句就好了 word-break:break-all; 一开始不知道是会解析成一个单词&#xff0c;用字符串拼接处理…

华为云新生代开发者招募

开发者您好&#xff0c;我们是华为2012UCD的研究团队 为了解年轻开发者的开发现状和趋势 正在邀请各位先锋开发者&#xff0c;与我们进行2小时的线上交流&#xff08;江浙沪附近可线下交流&#xff09; 聊聊您日常开发工作中的产品使用需求 成功参与访谈者将获得至少300元京…

基于亚马逊云科技无服务器服务快速搭建电商平台——性能篇

使用 Serverless 构建独立站的优势 在传统架构模式下&#xff0c;如果需要进行电商大促需要提前预置计算资源以支撑高并发访问&#xff0c;会造成计算资源浪费并且增加运维工作量。本文介绍一种新的部署方式&#xff0c;将 WordPress 和 WooCommerce 部署在 Amazon Lambda 中。…

CVPR2022 Semi-Supervised Semantic Segmentation Using Unreliable Pseudo-Labels

Semi-Supervised Semantic Segmentation Using Unreliable Pseudo-Labels 使用不可靠的伪标签的半监督语义分割 Paper&#xff1a;https://openaccess.thecvf.com/content/CVPR2022/html/Wang_Semi-Supervised_Semantic_Segmentation_Using_Unreliable_Pseudo-Labels_CVPR_202…

Docker 容器逃逸漏洞 (CVE-2020-15257)复现

漏洞概述 containerd是行业标准的容器运行时&#xff0c;可作为Linux和Windows的守护程序使用。在版本1.3.9和1.4.3之前的容器中&#xff0c;容器填充的API不正确地暴露给主机网络容器。填充程序的API套接字的访问控制验证了连接过程的有效UID为0&#xff0c;但没有以其他方式…

C语言:大小端字节序存储

一、大小端字节序存储介绍 大端字节序存储模式&#xff1a;把一个数据低位字节处的数据存放在高地址处&#xff0c;数据高位字节处的数据存放在低地址处 小端字节序存储模式&#xff1a;把一个数据低位字节处的数据存放在低地址处&#xff0c;数据高位字节处的数据存放在高地址…

论文阅读_医疗知识图谱_GraphCare

英文名称: GraphCare: Enhancing Healthcare Predictions with Open-World Personalized Knowledge Graphs 中文名称: GraphCare&#xff1a;通过开放世界的个性化知识图增强医疗保健预测 文章: http://arxiv.org/abs/2305.12788 代码: https://github.com/pat-jj/GraphCare 作…

mall :hutool项目源码解析

文章目录 一、mall开源项目1.1 来源1.2 项目转移1.3 项目克隆 二、Hutool工具类库2.1 Hutool 简介 三、源码解析3.1 集成与配置3.1.1 导入依赖3.1.2 添加配置 3.2 核心工具类3.2.1 AnnotationUtil使用&#xff1a;注解工具类3.2.2 BeanUtil使用&#xff1a;JavaBean的工具类3.2…

redis实战-实现优惠券秒杀解决超卖问题

全局唯一ID 唯一ID的必要性 每个店铺都可以发布优惠券&#xff1a; 当用户抢购时&#xff0c;就会生成订单并保存到tb_voucher_order这张表中&#xff0c;而订单表如果使用数据库自增ID就存在一些问题&#xff1a; id的规律性太明显&#xff0c;容易被用户根据id的间隔来猜测…

【Linux】【驱动】注册字符设备号

【Linux】【驱动】注册字符设备号 1. 绪论1 、静态分配设备号2、动态分配设备号3、注销设备号 2 实现的代码3 加载驱动程序 1. 绪论 在之前杂项设备的时候&#xff0c;设备号是固定的&#xff0c;字符设备就需要自己去申请设备号了&#xff0c; 申请设备号有两个方式&#xff…

Python入门教程 - 基本语法 (一)

目录 一、注释 二、Python的六种数据类型 三、字符串、数字 控制台输出练习 四、变量及基本运算 五、type()语句查看数据的类型 六、字符串的3种不同定义方式 七、数据类型之间的转换 八、标识符命名规则规范 九、算数运算符 十、赋值运算符 十一、字符串扩展 11.1…

如何飞速成为开源贡献者(Contributor)

如何飞速成为开源贡献者Contributor 一、环境信息1.1 硬件信息1.2 软件信息 二、Git安装2.1 Git介绍2.2 Git下载安装 三、开源项目选定四、GitHub参与开源流程4.1 Fork项目4.2 SSH配置4.2.1 为什么要配置SSH4.2.2 如何配置SSH 4.3 Clone项目4.4 IDEA关联4.5 PR生成4.6 PR提交 一…

OceanBase 4.x改装:另一种全链路追踪的尝试

本文作者&#xff1a;夏克 OceanBase 社区文档贡献者&#xff0c;曾多次参与 OceanBase 技术征文比赛&#xff0c;获得优秀名次。从事金融行业核心系统设计开发工作多年&#xff0c;服务于某交易所子公司&#xff0c;现阶段负责国产数据库调研。 本文为 OceanBase 第七期技术征…

java-数组

数组静态初始化写法&#xff1a; //静态初始化数组 int[] age new int[] {7,18,19}; double[] scores new double[]{67.5,77.8,94.2,99};//静态初始化数组简化写法 int[] age1 {7,18,19}; double[] scores2 {67.5,77.8,94.2,99};数组在内存中定义方式&#xff1a; 1.在内…

飞天使-python的面向对象

文章目录 面向对象面向对象思想类的定义和使用继承封装多态访问控制 参考视频 面向对象 面向对象思想 面向过程和面对对象的区别是什么&#xff1f; 答: 复用性高&#xff0c;面向对象类的定义和使用 类型里面的定义的时候 self 不能省去&#xff0c;应该写出 class person:…

开源项目如何推进人工智能

推荐&#xff1a;使用 NSDT场景编辑器快速搭建3D应用场景 对于那些不熟悉这个概念的人来说&#xff0c;开源软件或项目是那些向公众提供源代码的软件或项目&#xff0c;允许他们查看、使用和修改它。使用开源软件和工具具有多种优势&#xff0c;尤其是在构建复杂的基于 AI 的产…

pytorch异常——RuntimeError:Given groups=1, weight of size..., expected of...

文章目录 省流异常报错异常截图异常代码原因解释修正代码执行结果 省流 nn.Conv2d 需要的输入张量格式为 (batch_size, channels, height, width)&#xff0c;但您的示例输入张量 x 是 (batch_size, height, width, channels)。因此&#xff0c;需要对输入张量进行转置。 注意…

09 mysql fetchSize 所影响的服务器和客户端的交互

前言 这是一个 之前使用 spark 的时候 记一次 spark 读取大数据表 OOM OutOfMemoryError: GC overhead limit exceeded 因为一个 OOM 的问题, 当时使用了 fetchSize 的参数 应用服务 hang 住, 导致服务 503 Service Unavailable 在这个问题的地方, 出现了一个查询 32w 的数据…

分布式集群——搭建Hadoop环境以及相关的Hadoop介绍

系列文章目录 分布式集群——jdk配置与zookeeper环境搭建 分布式集群——搭建Hadoop环境以及相关的Hadoop介绍 文章目录 前言 一 hadoop的相关概念 1.1 Hadoop概念 补充&#xff1a;块的存储 1.2 HDFS是什么 1.3 三种节点的功能 I、NameNode节点 II、fsimage与edits…