在Linux环境下使用selenium执行web自动化

一、执行测试的必要组件

对于selenium的执行方式有很多,包括支持不同语言,实际使用时肯定选择自己熟悉的架构,比如我选择使用webdriver驱动的方式。

需要的组件包括:驱动firefox的工具geckodriver,加载到eclipse里的jar包 selenium-server-standalone.jar。

这个组合就可以实现在linux环境下,顺利调起firefox进行web的功能自动化测试。

二、组件部署

把geckodriver放在任意一个可访问的位置,为把他放在 了/usr/bin/下,然后在/etc/profile的PATH中增加了一个引用。

selenium-server-standalone.jar更简单,只要在java的工程里添加jar即可。

--geckodriver下载位置 https://github.com/mozilla/geckodriver/releases 有linux和windows两种支持

三、基本语法

--引用基本的包

import org.openqa.selenium.WebDriver;

import org.openqa.selenium.chrome.ChromeDriver;

import org.openqa.selenium.firefox.FirefoxDriver;

import org.openqa.selenium.edge.EdgeDriver;

import org.openqa.selenium.ie.InternetExplorerDriver;

import org.openqa.selenium.opera.OperaDriver;

import org.openqa.selenium.phantomjs.PhantomJSDriver;

--此为当前可支持的浏览器

WebDriver driver = new ChromeDriver();    //Chrome浏览器

WebDriver driver = new FirefoxDriver();   //Firefox浏览器

WebDriver driver = new EdgeDriver();      //Edge浏览器

WebDriver driver = new InternetExplorerDriver();  // Internet Explorer浏览器

WebDriver driver = new OperaDriver();     //Opera浏览器

WebDriver driver = new PhantomJSDriver();   //PhantomJS

--同时使用不同浏览器的话,首先要注意实例化的名称要有区别,另外/usr/bin/下的webdriver工具要补全。

selenium有8种定位方式:

  1. id
  2. name
  3. class name
  4. tag name
  5. link text
  6. partial link text
  7. xpath
  8. css selector

可以根据页面种没种元素使用的属性,灵活定位元素。

这8种定位方式在使用时:

driver.findElement(By.id())

driver.findElement(By.name())

driver.findElement(By.className())

driver.findElement(By.tagName())

driver.findElement(By.linkText())

driver.findElement(By.partialLinkText())

driver.findElement(By.xpath())

driver.findElement(By.cssSelector())

通过xpath定位,xpath定位有N种写法,这里列几个常用写法:

driver.findElement(By.xpath("//[@id='kw']"))driver.findElement(By.xpath("//[@name='wd']"))

driver.findElement(By.xpath("//input[@class='s_ipt']"))

driver.findElement(By.xpath("/html/body/form/span/input"))

driver.findElement(By.xpath("//span[@class='soutu-btn']/input"))

driver.findElement(By.xpath("//form[@id='form']/span/input"))

driver.findElement(By.xpath("//input[@id='kw' and @name='wd']"))

通过css定位,css定位有N种写法,这里列几个常用写法:

driver.findElement(By.cssSelector("#kw")

driver.findElement(By.cssSelector("[name=wd]")

driver.findElement(By.cssSelector(".s_ipt")

driver.findElement(By.cssSelector("html > body > form > span > input")

driver.findElement(By.cssSelector("span.soutu-btn> input#kw")

driver.findElement(By.cssSelector("form#form > span > input")

直接使用文本连接定位:

<a class="mnav" href="百度新闻——海量中文资讯平台" name="tj_trnews">新闻</a>

driver.findElement(By.linkText("新闻") --通过link text定位

driver.findElement(By.partialLinkText("新") --通过partialLink text定位

获得元素后,对元素进行操作:

WebElement search_text = driver.findElement(By.id("kw"));

WebElement search_button = driver.findElement(By.id("su"));

search_text.sendKeys("Java");

search_button.click();

--更多可用方法,可以直接通过补全命令查看。

四、selenium驱动浏览器

    driver.get("重定向科技"); --打开新窗口,地址为字符串内容。

    String title = driver.getTitle(); --获得浏览器标题

    driver.manage().window().maximize();--浏览器窗口最大化

    driver.manage().window().setSize(new Dimension(480, 800));

    driver.getCurrentUrl()--获得当前地址位置

    driver.navigate().back();--后退

    driver.navigate().forward();--前进

    driver.navigate().refresh();--刷新页面

    search_text.submit();--文本框控件的默认回车提交

    driver.quit();--退出

五、模拟鼠标操作

  1. contextClick() 右击
  2. clickAndHold() 鼠标点击并控制
  3. doubleClick() 双击
  4. dragAndDrop() 拖动
  5. release() 释放鼠标
  6. perform() 执行所有Actions中存储的行为

WebDriver driver = new ChromeDriver();

driver.get("https://www.baidu.com/");

WebElement search_setting = driver.findElement(By.linkText("设置"));

Actions action = new Actions(driver);

action.clickAndHold(search_setting).perform();

driver.quit();

--百度首页设置悬停下拉菜单。

Actions action = new Actions(driver);

// 鼠标右键点击指定的元素

action.contextClick(driver.findElement(By.id("element"))).perform();

// 鼠标右键点击指定的元素

action.doubleClick(driver.findElement(By.id("element"))).perform();

// 鼠标拖拽动作, 将 source 元素拖放到 target 元素的位置。

WebElement source = driver.findElement(By.name("element"));

WebElement target = driver.findElement(By.name("element"));

action.dragAndDrop(source,target).perform();

// 释放鼠标

action.release().perform();

六、模拟键盘操作

WebDriver driver = new ChromeDriver();

driver.get("https://www.baidu.com");

WebElement input = driver.findElement(By.id("kw"));

//输入框输入内容

input.sendKeys("seleniumm");

Thread.sleep(2000);

//删除多输入的一个 m

input.sendKeys(Keys.BACK_SPACE);

Thread.sleep(2000);

//输入空格键+“教程”

input.sendKeys(Keys.SPACE);

input.sendKeys("教程");

Thread.sleep(2000);

//ctrl+a 全选输入框内容

input.sendKeys(Keys.CONTROL,"a");

Thread.sleep(2000);

//ctrl+x 剪切输入框内容

input.sendKeys(Keys.CONTROL,"x");

Thread.sleep(2000);

//ctrl+v 粘贴内容到输入框

input.sendKeys(Keys.CONTROL,"v");

Thread.sleep(2000);

//通过回车键盘来代替点击操作

input.sendKeys(Keys.ENTER);

Thread.sleep(2000);

driver.quit();

以下为常用的键盘操作:

sendKeys(Keys.BACK_SPACE) 回格键(BackSpace)

sendKeys(Keys.SPACE) 空格键(Space)

sendKeys(Keys.TAB) 制表键(Tab)

sendKeys(Keys.ESCAPE) 回退键(Esc)

sendKeys(Keys.ENTER) 回车键(Enter)

sendKeys(Keys.CONTROL,‘a’) 全选(Ctrl+A)

sendKeys(Keys.CONTROL,‘c’) 复制(Ctrl+C)

sendKeys(Keys.CONTROL,‘x’) 剪切(Ctrl+X)

sendKeys(Keys.CONTROL,‘v’) 粘贴(Ctrl+V)

sendKeys(Keys.F1) 键盘 F1 …… sendKeys(Keys.F12) 键盘 F12

七、获取断言

  1. getTitle(): 用于获得当前页面的title。
  2. getCurrentUrl() : 用户获得当前页面的URL。
  3. getText() 获取页面文本信息。

八、设置元素等待

WebDriver提供了两种类型的等待:显式等待和隐式等待。

显式等待

WebDriver driver = new ChromeDriver();

driver.get("https://www.baidu.com");

//显式等待, 针对某个元素等待

WebDriverWait wait = new WebDriverWait(driver,10,1);

wait.until(new ExpectedCondition<WebElement>(){

  @Override

  public WebElement apply(WebDriver text) {

        return text.findElement(By.id("kw"));

      }

}).sendKeys("selenium");

driver.findElement(By.id("su")).click();

Thread.sleep(2000);

driver.quit();

WebDriverWait类是由WebDirver提供的等待方法。在设置时间内,默认每隔一段时间检测一次当前页面元素是否存在,如果超过设置时间检测不到则抛出异常。具体格式如下: WebDriverWait(driver, 10, 1) driver: 浏览器驱动。 10: 最长超时时间, 默认以秒为单位。 1: 检测的的间隔(步长) 时间, 默认为 0.5s。

隐式等待

WebDriver driver = new ChromeDriver();

//页面加载超时时间设置为 5s

driver.manage().timeouts().pageLoadTimeout(5, TimeUnit.SECONDS);

driver.get("https://www.baidu.com/");

//定位对象时给 10s 的时间, 如果 10s 内还定位不到则抛出异常

driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);

driver.findElement(By.id("kw")).sendKeys("selenium");

//异步脚本的超时时间设置成 3s

driver.manage().timeouts().setScriptTimeout(3, TimeUnit.SECONDS);

driver.quit();

九、获得一组元素

定位一组元素的方法与定位单个元素的方法类似,唯一的区别是在单词 findElement 后面多了一个 s 表示复数。

之后可以用List 方式进行访问。

十、多表单切换

在 Web 应用中经常会遇到 frame/iframe 表单嵌套页面的应用, WebDriver 只能在一个页面上对元素识别与 定位, 对于 frame/iframe 表单内嵌页面上的元素无法直接定位。 这时就需要通过 switchTo().frame()方法将当前定 位的主体切换为 frame/iframe 表单的内嵌页面中。

<html>

<body>

...

<iframe id="x-URS-iframe" ...>

<html>

<body>

...

<input name="email" >

WebDriver driver = new ChromeDriver();

driver.get("http://www.126.com");

WebElement xf = driver.findElement(By.xpath("//*[@id='loginDiv']/iframe"));

driver.switchTo().frame(xf);

driver.findElement(By.name("email")).clear();

driver.findElement(By.name("email")).sendKeys("username");

driver.findElement(By.name("password")).clear();

driver.findElement(By.name("password")).sendKeys("password");

driver.findElement(By.id("dologin")).click();

driver.switchTo().defaultContent();

//……

如果完成了在当前表单上的操作,则可以通过switchTo().defaultContent()方法跳出表单。

十一、多窗口切换

在页面操作过程中有时候点击某个链接会弹出新的窗口, 这时就需要主机切换到新打开的窗口上进行操作。WebDriver提供了switchTo().window()方法可以实现在不同的窗口之间切换。 以百度首页和百度注册页为例,在两个窗口之间的切换如下图。

WebDriver driver = new ChromeDriver();

driver.get("https://www.baidu.com");

//获得当前窗口句柄

String search_handle = driver.getWindowHandle();

//打开百度注册窗口

driver.findElement(By.linkText("登录")).click();

Thread.sleep(3000);

driver.findElement(By.linkText("立即注册")).click();

//获得所有窗口句柄

Set<String> handles = driver.getWindowHandles();

//判断是否为注册窗口, 并操作注册窗口上的元素

for(String handle : handles){

  if (handle.equals(search_handle)==false){

    //切换到注册页面

    driver.switchTo().window(handle);

    System.out.println("now register window!");

    Thread.sleep(2000);

    driver.findElement(By.name("userName")).clear();

    driver.findElement(By.name("userName")).sendKeys("user name");

    driver.findElement(By.name("phone")).clear();

    driver.findElement(By.name("phone")).sendKeys("phone number");

    //......

    Thread.sleep(2000);

    //关闭当前窗口

    driver.close();

  }

}

Thread.sleep(2000);

driver.quit();

  1. getWindowHandle(): 获得当前窗口句柄。
  2. getWindowHandles(): 返回的所有窗口的句柄到当前会话。
  3. switchTo().window(): 用于切换到相应的窗口,与上一节的switchTo().frame()类似,前者用于不同窗口的切换, 后者用于不同表单之间的切换。

十二、下拉框选择

<select id="nr" name="NR">

<option value="10" selected>每页显示 10 条</option>

<option value="20">每页显示 20 条</option>

<option value="50">每页显示 50 条</option>

<select>

webDriver driver = new ChromeDriver();

driver.get("https://www.baidu.com");

driver.findElement(By.linkText("设置")).click();

driver.findElement(By.linkText("搜索设置")).click();

Thread.sleep(2000);

//<select>标签的下拉框选择

WebElement el = driver.findElement(By.xpath("//select"));

Select sel = new Select(el);

sel.selectByValue("20");

Thread.sleep(2000);

driver.quit();

十三、警告框处理

在 WebDriver中处理JavaScript所生成的alert、confirm以及prompt十分简单,具体做法是使用switch_to_alert()方法定位到alert/confirm/prompt,然后使用text/accept/dismiss/sendKeys等方法进行操作。

  1. getText(): 返回 alert/confirm/prompt 中的文字信息。
  2. accept(): 接受现有警告框。
  3. dismiss(): 解散现有警告框。
  4. sendKeys(keysToSend): 发送文本至警告框。
  5. keysToSend: 将文本发送至警告框。

WebDriver driver = new ChromeDriver();

driver.get("https://www.baidu.com");

driver.findElement(By.linkText("设置")).click();

driver.findElement(By.linkText("搜索设置")).click();

Thread.sleep(2000);

//保存设置

driver.findElement(By.className("prefpanelgo")).click();

//接收弹窗

driver.switchTo().alert().accept();

Thread.sleep(2000);

driver.quit();

十四、文件上传

<body>

<div class="row-fluid">

<div class="span6 well">

<h3>upload_file</h3>

<input type="file" name="file" />

</div>

</div>

</body>

WebDriver driver = new ChromeDriver();

File file = new File("./HTMLFile/upfile.html");

String filePath = file.getAbsolutePath();

driver.get(filePath);

//定位上传按钮, 添加本地文件

driver.findElement(By.name("file")).sendKeys("D:\\upload_file.txt");

Thread.sleep(5000);

driver.quit();

十五、浏览器cookie操作

有时候我们需要验证浏览器中Cookie是否正确, 因为基于真实Cookie的测试是无法通过白盒测试和集成测试进行的。WebDriver提供了操作Cookie的相关方法可以读取、 添加和删除Cookie信息。

WebDriver 操作Cookie的方法:

  1. getCookies() 获得所有 cookie 信息。
  2. getCookieNamed(String name) 返回字典的key为“name”的Cookie信息。
  3. addCookie(cookie dict) 添加Cookie。“cookie_dict”指字典对象,必须有 name和value值。
  4. deleteCookieNamed(String name) 删除Cookie 信息。 “name”是要删除的 cookie的名称; “optionsString” 是该Cookie的选项,目前支持的选项包括“路径” , “域” 。
  5. deleteAllCookies() 删除所有 cookie 信息。

WebDriver driver = new ChromeDriver();

driver.get("https://www.baidu.com");

Cookie c1 = new Cookie("name", "key-aaaaaaa");

Cookie c2 = new Cookie("value", "value-bbbbbb");

driver.manage().addCookie(c1);

driver.manage().addCookie(c2);

//获得 cookie

Set<Cookie> coo = driver.manage().getCookies();

System.out.println(coo);

//删除所有 cookie

//driver.manage().deleteAllCookies();

driver.quit();

十六、调用JavaScript代码

虽然WebDriver提供了操作浏览器的前进和后退方法,但对于浏览器滚动条并没有提供相应的操作方法。在这种情况下,就可以借助JavaScript来控制浏览器的滚动条。WebDriver提供了executeScript()方法来执行JavaScript代码。

用于调整浏览器滚动条位置的JavaScript代码如下:

<!-- window.scrollTo(左边距,上边距); -->

window.scrollTo(0,450);

window.scrollTo()方法用于设置浏览器窗口滚动条的水平和垂直位置。方法的第一个参数表示水平的左间距,第二个参数表示垂直的上边距。其代码如下:

WebDriver driver = new ChromeDriver();

//设置浏览器窗口大小

driver.manage().window().setSize(new Dimension(700, 600));

driver.get("https://www.baidu.com");

//进行百度搜索

driver.findElement(By.id("kw")).sendKeys("webdriver api");

driver.findElement(By.id("su")).click();

Thread.sleep(2000);

//将页面滚动条拖到底部

((JavascriptExecutor)driver).executeScript("window.scrollTo(100,450);");

Thread.sleep(3000);

driver.quit();

十七、获取窗口截图

WebDriver driver = new ChromeDriver();

driver.get("https://www.baidu.com");

File srcFile = ((TakesScreenshot)driver).getScreenshotAs(OutputType.FILE);

try {

  FileUtils.copyFile(srcFile,new File("d:\\screenshot.png"));

} catch (IOException e) {

  e.printStackTrace();

}

driver.quit();

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

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

相关文章

Express 的 req 和 res 对象

新建 learn-express文件夹&#xff0c;执行命令行 npm init -y npm install express 新建 index.js const express require(express); const app express();app.get(/, (req, res, next) > {res.json(return get) })app.post(/, (req, res, next) > {res.json(retur…

论文精读-SRFormer Permuted Self-Attention for Single Image Super-Resolution

论文精读-SRFormer: Permuted Self-Attention for Single Image Super-Resolution SRFormer:用于单图像超分辨率的排列自注意 Params&#xff1a;853K&#xff0c;MACs&#xff1a;236G 优点&#xff1a; 1、参考SwinIR的RSTB提出了新的网络块结构PAB&#xff08;排列自注意力…

sky walking日志采集以及注意事项

文章目录 1&#xff0c;sky walking日志采集功能概述2&#xff0c;采集log4j2日志3&#xff0c;采集logback日志4&#xff0c;效果展示5&#xff0c;注意事项 1&#xff0c;sky walking日志采集功能概述 在介绍Sky walking日志采集功能之前&#xff0c;最好在系统学习一遍日志…

【医学AI|顶刊精析|05-25】哈佛医学院·告别切片局限:3D病理如何革新癌症预后

小罗碎碎念 先打个预防针&#xff0c;我写这篇推文用了两个多小时&#xff0c;这就意味着要读懂这篇文章不太容易&#xff0c;我已经做好反复阅读的准备了。不过&#xff0c;风险之下&#xff0c;亦是机会&#xff0c;读懂的人少&#xff0c;这个赛道就越值得押宝。 在正式阅…

【C语言】8.C语言操作符详解(3)

文章目录 10.操作符的属性&#xff1a;优先级、结合性10.1 优先级10.2 结合性 11.表达式求值11.1 整型提升11.2 算术转换11.3 问题表达式解析11.3.1 表达式111.3.2 表达式211.3.3 表达式311.3.4 表达式411.3.5 表达式5: 11.4 总结 10.操作符的属性&#xff1a;优先级、结合性 …

基于Keras的手写数字识别(附源码)

目录 引言 为什么要创建虚拟环境&#xff0c;好处在哪里&#xff1f; 源码 我修改的部分 调用本地数据 修改第二层卷积层 引言 本文是博主为了记录一个好的开源代码而写&#xff0c;下面是代码出处&#xff01;强烈建议收藏&#xff01;【深度学习实战—1】&#xff1a…

Keras深度学习框架基础第二讲:层接口(layers API)第二部分“基本层类”

1、layer 类 典型的layer类如下 keras.layers.Layer(activity_regularizerNone,trainableTrue,dtypeNone,autocastTrue,nameNone,**kwargs )这是一个所有层都继承的基类。 一个层是一个可调用的对象&#xff0c;它接受一个或多个张量作为输入&#xff0c;并输出一个或多个张…

【spring】@ControllerAdvice注解学习

ControllerAdvice介绍 ControllerAdvice 是 Spring 框架提供的一个注解&#xff0c;用于定义一个全局的异常处理类或者说是控制器增强类&#xff08;controller advice class&#xff09;。这个特性特别适用于那些你想应用于整个应用程序中多个控制器的共有行为&#xff0c;比…

ctfhub中的SSRF的相关例题(下)

目录 URL Bypass 知识点 相关例题 数字IP Bypass 相关例题 方法一&#xff1a;使用数字IP 方法二&#xff1a;转16进制 方法三&#xff1a;用localhost代替 方法四&#xff1a;特殊地址 302跳转 Bypass ​编辑 关于localhost原理: DNS重绑定 Bypass 知识点&…

ant design pro 6.0搭建教程

一、搭建 环境&#xff1a; Node.js 18.16.1 ant design pro 6.0 注意&#xff1a;选择umi3时&#xff0c;使用node.js 18版本的会报错&#xff0c;可以实践一下&#xff0c;这里就不再进行实践了。 umi3需要版本是低于node.js 18的 node下载地址&#xff1a; https://nodejs.…

可重构柔性装配产线,为智能制造领域带来了新的革命性变革

随着科技的飞速发展&#xff0c;个性化需求逐渐成为市场的主导。在这个充满变革的时代&#xff0c;制造业正面临着前所未有的挑战和机遇。如何快速响应市场需求、提高生产效率、保证产品质量&#xff0c;成为每一家制造企业必须思考的问题。 在这样的背景下&#xff0c;富唯智…

免费插件集-illustrator插件-Ai插件-文本对象和文本段落互转

文章目录 1.介绍2.安装3.通过窗口>扩展>知了插件4.功能解释5.总结 1.介绍 本文介绍一款免费插件&#xff0c;加强illustrator使用人员工作效率&#xff0c;进行文本对象和文本段落互转。首先从下载网址下载这款插件 https://download.csdn.net/download/m0_67316550/878…

00.OpenLayers快速开始

00OpenLayers快速开始 官方文档&#xff1a; 快速开始&#xff1a;https://openlayers.org/doc/quickstart.html 需要node环境 一、设置新项目 npm create ol-app my-app cd my-app npm start第一个命令将创建一个名为 my-app​ 的目录&#xff08;如果您愿意&#xff0c;…

赞扬老师的词汇积累

1 词汇 启明星 象征意义&#xff1a;在古代文化中&#xff0c;启明星&#xff08;即金星&#xff0c;特别是在黎明前出现在东方天空的那颗亮星&#xff09;常被视为新一天开始的象征&#xff0c;预示着光明和希望的到来。因此&#xff0c;将老师们比喻为“启明星”&#xff0…

Java——简易图书管理系统

本文使用 Java 实现一个简易图书管理系统 一、思路 简易图书管理系统说白了其实就是 用户 与 图书 这两个对象之间的交互 书的属性有 书名 作者 类型 价格 借阅状态 而用户可以分为 普通用户 管理员 使用数组将书统一管理起来 用户对这个数组进行操作 普通用户可以进…

有趣的css - 圆形背景动效多选框

大家好&#xff0c;我是 Just&#xff0c;这里是「设计师工作日常」&#xff0c;今天分享的是用 css 实现一个圆形背景动效多选框&#xff0c;适用提醒用户勾选场景&#xff0c;突出多选框选项&#xff0c;可以有效增加用户识别度。 最新文章通过公众号「设计师工作日常」发布…

js画思维导图代码2

这段代码是一个使用Vue.js和D3.js构建的树形图组件。它是一个Vue组件&#xff0c;用于创建和显示一个交互式的树形结构图。下面是对这段代码的简要分析&#xff1a; 模板部分 (<template>): 定义了组件的HTML结构&#xff0c;包括一个隐藏的提示框(#tooltip)和一个用于显…

VBA批量合并带有图片、表格与文本框的Word

本文介绍基于VBA语言&#xff0c;对大量含有图片、文本框与表格的Word文档加以批量自动合并&#xff0c;并在每一次合并时添加分页符的方法。 在我们之前的文章基于Python中docx与docxcompose批量合并多个Word文档文件并逐一添加分页符&#xff08;https://blog.csdn.net/zhebu…

helloworld 可执行程序得到的过程

// -E 预处理 开发过程中可以确定某个宏 // -c 把预处理 编译 汇编 都做了,但是不链接 // -o 指定输出文件 // -I 指定头文件目录 // -L 指定链接库文件目录 // -l 指定链接哪一个库文件 #include <stdio.h> #include <stdlib.h> #include <string.h>int mai…

【postgresql初级使用】在表的多个频繁使用列上创建一个索引,多条件查询优化,多场景案例揭示索引失效

多列索引 ​专栏内容&#xff1a; postgresql使用入门基础手写数据库toadb并发编程 个人主页&#xff1a;我的主页 管理社区&#xff1a;开源数据库 座右铭&#xff1a;天行健&#xff0c;君子以自强不息&#xff1b;地势坤&#xff0c;君子以厚德载物. 文章目录 多列索引概述 …