10. selenium API (二)

news2025/1/27 12:42:41

目录

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();
    }

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Laravel 集合的使用 集合的常用方法 模型的数据集合 ⑩

作者 : SYFStrive 博客首页 : HomePage &#x1f4dc;&#xff1a; THINK PHP &#x1f4cc;&#xff1a;个人社区&#xff08;欢迎大佬们加入&#xff09; &#x1f449;&#xff1a;社区链接&#x1f517; &#x1f4cc;&#xff1a;觉得文章不错可以点点关注 &#x1f44…

【Linux】文件

Linux 文件 什么叫文件C语言视角下文件的操作文件的打开与关闭文件的写操作文件的读操作 & cat命令模拟实现 文件操作的系统接口open & closewriteread 文件描述符进程与文件的关系重定向问题Linux下一切皆文件的认识文件缓冲区缓冲区的刷新策略 stuout & stderr 什…

学信网学历电子注册备案表 下载方法

如果你需要成人高考的专升本 那么就会需要 学信网学历电子注册备案表 全称叫 教育部学历证书电子注册备案表 是学信网依托全国高等教育学生信息数据库&#xff0c;对学生的学历信息提供的在线验证报告&#xff0c;是我们验证学历真伪的一份报告 学历电子注册备案表在 考研、考…

shell脚本中时间的编写规范20230902

背景&#xff1a;经常写shell&#xff0c;但是很多种时间格式规范真是记不住哈&#xff0c;&#x1f604;&#xff0c;索性记录一下 一、 获取-年 下面的这两种写法都成 year$(date "%Y") yeardate "%Y"echo -e "测试输出 年: ${year}"输出结…

springboot web开发springmvc自动配置原理

前言 我们也知道springboot启用springmvc基本不用做什么配置可以很方便就使用了但是不了解原理,开发过程中遇到点问题估计就比较头疼,不管了解的深不深入,先巴拉一番再说… 下面我们先看看官网…我的版本是2.3.2版本,发现官网改动也比较大…不同版本自己巴拉下吧,结构虽然变化…

PMD代码检查:过长的变量名字(LongVariable)

https://docs.pmd-code.org/pmd-doc-6.55.0/pmd_rules_java_codestyle.html#longvariable 属性、正式变量、局部变量的名字如果太长&#xff0c;会使代码难理解。例如&#xff0c;下面的代码报违反项&#xff1a; 可以通过属性minimum配置报违反规则的最小长度&#xff08;默…

qt.qpa.plugin:找不到Qt平台插件“wayland“|| (下载插件)Ubuntu上解决方案

相信大家也都知道这个地方应该做什么&#xff0c;当然是下载这个qt平台的插件wayland,但是很多人可能不知道怎么下载这个插件。 那么我现在要说的这个方法就是针对这种的。 sudo apt install qtwayland5完事儿了奥兄弟们。 看看效果 正常了奥。

总结ADX指标交易的好处

股神巴菲特从一个穷小子变成世界富豪&#xff0c;而闻名世界。anzo capital昂首资本以为这辈子再也不会和巴菲特产生任何交集&#xff0c;直到我看了巴菲特的发家史&#xff0c;才发现原来我们都使用过ADX指标盈利过&#xff0c;下面anzo capital昂首资本就总结一下使用ADX指…

如何大批量、低成本获取精准客户

身为一个企业或广告投放的决策人&#xff0c;当你在做每一次营销决策的时候&#xff0c;一定会回答一个问题&#xff1a;如何把产品卖给对的人&#xff1f; 目前经济形势下&#xff0c;消费活跃&#xff0c;但是获客却越来越难&#xff0c;在大数据弥漫的今天&#xff0c;我们仿…

leetcode 1365. 有多少小于当前数字的数字

2023.9.2 本题直观的解法就是双层for循环暴力求解&#xff1a; 暴力解&#xff1a; class Solution { public:vector<int> smallerNumbersThanCurrent(vector<int>& nums) {vector<int> ans;for(int i0; i<nums.size(); i){int temp 0;//比当前元素…

如何确认linux的包管理器是yum还是apt,确认之后安装其他程序的时候就需要注意安装命令

打开终端 输入apt&#xff0c;下图中提示未找到命令&#xff0c;则基本上包管理工具就是用yum的 输入yum&#xff0c;我们看到有打印信息&#xff0c;则说明包管理工具是yum的&#xff0c;离线安装命令使用rpm

kafka详解二

kafka详解二 1、 offset 1.1 offset介绍 老版本 Consumer 的位移管理是依托于 Apache ZooKeeper 的&#xff0c;它会自动或手动地将位移数据提交到 ZooKeeper 中保存。当 Consumer 重启后&#xff0c;它能自动从 ZooKeeper 中读取位移数据&#xff0c;从而在上次消费截止的地…

中国地方ZF数据开放指数(省域指数、城市指数)

“中国开放数林指数”是我国首个专注于评估政府数据开放水平的专业指数&#xff0c;由复旦大学数字与移动治理实验室制作出品。开放数据&#xff0c;蔚然成林&#xff0c; “开放数林”意喻我国政府数据开放利用的生态体系&#xff0c;一棵棵地方开放“数木”由最初的丛然并生、…

postgres源码解析54 Brin Index--1

Brin Index简介 brin index是Block range Index的缩写&#xff0c;顾名思义该索引是指块范围索引&#xff0c;该索引适合在超大表中进行过滤性扫描。基本的思路是追踪heap页域的最大值与最小值&#xff0c;用于过滤不符合条件的数据块。以下图为例&#xff0c;右边的堆表包含三…

ARM编程模型-寄存器组

Cortex A系列ARM处理器共有40个32位寄存器,其中33个为通用寄存器,7个为状态寄存器。usr模式和sys模式共用同一组寄存器。 通用寄存器包括R0~R15,可以分为3类: 未分组寄存器R0~R7分组寄存器R8~R14、R13(SP) 、R14(LR)程序计数器PC(R15)、R8_fiq-R12_fir为快中断独有 在不同模…

VITIS编译启动文件

source /home/wj/xilinx/PetaLinux/2021.1/tool/settings.sh source /home/wj/xilinx/Vitis/2021.1/settings64.sh source /home/wj/xilinx/Vivado/2021.1/settings64.sh 0 层 eng/home/wj/ETHERCAT_DW/meta-adi/meta-adi-core 1 层 /home/wj/ETHERCAT_DW/meta-adi/meta-ad…

【算法竞赛宝典】插入排序

【算法竞赛宝典】插入排序 题目描述伪代码代码展示代码讲解 题目描述 伪代码 代码展示 //插入排序数,请自己根据例程修改 #include <iostream>using namespace std;int main() {int a[11] {1, 4, 6, 9, 13, 16, 19, 28, 40, 100};int temp1, temp2, number, end, i, j…

go学习part20(3)反射细节

1.Set函数的细节 错误示范 正确示范:传指针再调用Elem() 2.反射的高级用法 1&#xff09;方法调用&#xff08;传参和返回值都是Value&#xff09; 方法顺序i是按照方法名字的顺序来计算&#xff0c;比较ascii码 2)结构体字段数 3)value.Field&#xff08;i&#xff09;获取…

MPI之虚拟进程拓扑

什么是虚拟进程拓扑 在很多并行应用进程中&#xff0c;进程的线性排列不能充分的反映进程间在逻辑上的通信模型&#xff0c;通常由问题几何和所用的算法决定&#xff0c;进程经常被排列成二维或者三维网络形式的拓扑模型而通常用一个图来描述逻辑进程排列&#xff0c;此种逻辑…

百度搜索清理大量低质量网站

我是卢松松&#xff0c;点点上面的头像&#xff0c;欢迎关注我哦&#xff01; 据部分站长爆料&#xff1a;百度大规模删低质量网站的百度资源站长平台权限&#xff0c;很多网站都被删除了百度站长资源平台后台权限&#xff0c;以前在百度后台添加的网站大量被删除&#xff01;…