自动化测试-Selenium

简介: 自动化测试-Selenium

一. Selenium介绍

selenium 是用来做web自动化测试的框架,支持各种浏览器,各种,支持各种语言

原理:

二. 元素定位

2.1 XPath 定位

绝对路径: /html/head/title

相对路径以双斜杠开头,常见的相对路径定位有以下几种:

<1>相对路径+索引: 索引是从1开始的

<2>相对路径+属性值:

<3>相对路径+通配符

<4>相对路径+文本匹配

2.2 CSS定位

• id选择器: #id

• 类选择器: .class

• 标签选择: 标签名

• 后代选择器: 父级选择器 子级选择器

三. 操作测试对象

3.1 常见API

• click 点击对象


• send_keys 在对象上模拟按键输入


• clear 清除对象输入的文本内容


• submit 提交


• getAttribute 获取标签中value属性所对应的值


• text 由于获取元素的文本信息

public class Demo1 {
    public static void main(String[] args) throws InterruptedException {
        ChromeOptions options=new ChromeOptions();
        //允许所有请求
        options.addArguments("--remote-allow-origins=*");
        WebDriver webDriver =new ChromeDriver(options);
        //获取网址
        webDriver.get("https://www.sogou.com");
        //获取value标签元素文本信息
        String str=webDriver.findElement(By.xpath("//input[@value=\"搜狗搜索\"]")).getAttribute("value");
        System.out.println(str);
        //输入搜索内容
        webDriver.findElement(By.cssSelector("#query")).sendKeys("软件测试");
        Thread.sleep(3000);
        webDriver.findElement(By.xpath("//input[@value=\"搜狗搜索\"]")).click();
        Thread.sleep(3000);
        //找到并打印所有a标签下em标签中的内容
        List<WebElement> elements=webDriver.findElements(By.cssSelector("a em"));
        for (int i = 0; i < elements.size(); i++) {
            System.out.println(elements.get(i).getText());
        }
        Thread.sleep(3000);
        webDriver.close();
 
    }
}
public static void main(String[] args) throws InterruptedException {
        ChromeOptions options=new ChromeOptions();
        options.addArguments("--remote-allow-origins=*");
        WebDriver webDriver=new ChromeDriver(options);
        webDriver.get("https://www.sogou.com/");
        Thread.sleep(3000);
        webDriver.findElement(By.cssSelector("#query")).sendKeys("软件测试");
        Thread.sleep(3000);
        //由于此处的搜狗搜索在form标签中,因此能够顺利提交
        //webDriver.findElement(By.cssSelector("#stb")).click();
        webDriver.findElement(By.cssSelector("#stb")).submit();
        Thread.sleep(3000);
        //此时代码是会报错的,因为a标签并不在form标签内
        //webDriver.findElement(By.cssSelector("#weixinch")).submit();
        webDriver.close();
    }

3.2 等待

public static void main(String[] args) throws InterruptedException {
        ChromeOptions options=new ChromeOptions();
        options.addArguments("--remote-allow-origins=*");
        WebDriver webDriver=new ChromeDriver(options);
        webDriver.get("https://www.baidu.com/");
        webDriver.findElement(By.cssSelector("#s-top-loginbtn")).click();
        //隐式等待
        //webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.DAYS);
        //显示等待,若加载出直接执行下面代码,若在指定时间内没有加载出来,就抛异常
        new WebDriverWait(webDriver,10).until(ExpectedConditions.presenceOfElementLocated(By.cssSelector("#s-top-loginbtn")));
        //强制等待3s
        Thread.sleep(3000);
        webDriver.findElement(By.xpath("//*[@id=\"TANGRAM__PSP_11__userName\"]")).sendKeys("1111");
        webDriver.close();
    }

隐式等待等待的是整个页面的元素,而显示等待等待的是一定的条件.

3.3 打印信息(标题/URL)

    public static void main(String[] args) {
        ChromeOptions options =new ChromeOptions();
        options.addArguments("--remote-allow-origins=*");
        WebDriver webDriver=new ChromeDriver(options);
        webDriver.get("https://www.sogou.com/");
        String title=webDriver.getTitle();
        String url=webDriver.getCurrentUrl();
        System.out.println("当前标题:"+title+"当前url:"+url);
        webDriver.close();
    }

3.4 浏览器的操作

    public static void main(String[] args) throws InterruptedException {
        ChromeOptions options=new ChromeOptions();
        options.addArguments("--remote-allow-origins=*");
        WebDriver webDriver=new ChromeDriver(options);
        webDriver.get("https://www.sogou.com");
        webDriver.findElement(By.cssSelector("#query")).sendKeys("软件测试");
        webDriver.findElement(By.cssSelector("#stb")).click();
        webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.DAYS);
        //后退一步
        webDriver.navigate().back();
        Thread.sleep(3000);
        //前进一步
        webDriver.navigate().forward();
        Thread.sleep(3000);
        //使屏幕最大化
        webDriver.manage().window().maximize();
        Thread.sleep(3000);
        //全屏
        webDriver.manage().window().fullscreen();
        Thread.sleep(3000);
        //自定义窗口大小
        webDriver.manage().window().setSize(new Dimension(600,1000));
        Thread.sleep(3000);
        //滑动滚动条
        ((JavascriptExecutor)webDriver).executeScript("document.documentElement.scrollTop=19999");
    }

3.5 键盘事件

通过sendKeys()调用按键:


• sendkeys(Keys.TAB) #TAB


• sendKeys(Keys.ENTER) #回车


• sendKeys(Keys.SPACE) #空格键


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

  public static void main(String[] args) throws InterruptedException {
        ChromeOptions options=new ChromeOptions();
        options.addArguments("--remote-allow-origins=*");
        WebDriver webDriver=new ChromeDriver(options);
        webDriver.get("https://www.sogou.com/");
        Thread.sleep(3000);
        webDriver.findElement(By.cssSelector("#query")).sendKeys("软件测试");
        Thread.sleep(3000);
        webDriver.findElement(By.cssSelector("#query")).sendKeys(Keys.SPACE);
        Thread.sleep(3000);
        webDriver.findElement(By.cssSelector("#query")).sendKeys("软件开发");
        Thread.sleep(3000);
        webDriver.findElement(By.cssSelector("#query")).sendKeys(Keys.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)

    public static void main(String[] args) throws InterruptedException {
        ChromeOptions options=new ChromeOptions();
        options.addArguments("--remote-allow-origins=*");
        WebDriver webDriver=new ChromeDriver(options);
        webDriver.get("https://www.sogou.com/");
        webDriver.findElement(By.cssSelector("#query")).sendKeys("软件测试");
        Thread.sleep(3000);
        webDriver.findElement(By.cssSelector("#query")).sendKeys(Keys.CONTROL,"a");
        Thread.sleep(3000);
        webDriver.findElement(By.cssSelector("#query")).sendKeys(Keys.CONTROL,"x");
        Thread.sleep(3000);
        webDriver.findElement(By.cssSelector("#query")).sendKeys(Keys.CONTROL,"v");
        Thread.sleep(3000);
        webDriver.findElement(By.cssSelector("#query")).sendKeys(Keys.ENTER);
    }

3.6 鼠标事件

Actions类:

• contextClick() 右击

• doubleClick() 双击

• dragAndDrop() 拖动

• moveToElement() 移动

    public static void main(String[] args) throws InterruptedException {
        ChromeOptions options=new ChromeOptions();
        options.addArguments("--remote-allow-origins=*");
        WebDriver webDriver=new ChromeDriver(options);
        webDriver.get("https://www.sogou.com/");
        webDriver.findElement(By.cssSelector("#query")).sendKeys("软件测试");
        webDriver.findElement(By.cssSelector("#query")).sendKeys(Keys.ENTER);
        Actions actions=new Actions(webDriver);
        Thread.sleep(3000);
        //需要现将鼠标移动到要操作的元素,然后右击,要perform()才会有效果
        actions.moveToElement( webDriver.findElement(By.cssSelector("#sogou_weixin"))).contextClick().perform();
    }

四. 特殊操作

为了方便测试的演示,测试的页面都是自制的。

4.1 定位一组元素

页面:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <h3>checkbox</h3>
<div class="well">
<form class="form-horizontal">
<div class="control-group">
<label class="control-label" for="c1">checkbox1</label>
<div class="controls">
<input type="checkbox" id="c1" />
</div>
</div>
<div class="control-group">
<label class="control-label" for="c2">checkbox2</label>
<div class="controls">
<input type="checkbox" id="c2" />
</div>
</div>
<div class="control-group">
<label class="control-label" for="c3">checkbox3</label>
<div class="controls">
<input type="checkbox" id="c3" />
</div>
</div>
<div class="control-group">
<label class="control-label" for="r">radio1</label>
<div class="controls">
<input type="radio" id="r1" />
</div>
</div>
<div class="control-group">
<label class="control-label" for="r">radio2</label>
<div class="controls">
<input type="radio" id="r2" />
</div>
</div>
</form>
</div>
</body>
</html>

测试:

    public static void main(String[] args) {
        ChromeOptions options=new ChromeOptions();
        options.addArguments("--remote-allow-origins=*");
        WebDriver webDriver=new ChromeDriver(options);
        webDriver.get("http://localhost:63342/SeleniumTest/page/test1.html?_ijt=a28mk13t2kbijoe7d2clon53lj&_ij_reload=RELOAD_ON_SAVE");
        webDriver.manage().timeouts().implicitlyWait(3,TimeUnit.DAYS);
        List<WebElement> webElements=webDriver.findElements(By.xpath("//input[@type=\"checkbox\"]"));
        for (int i = 0; i < webElements.size(); i++) {
            System.out.println(webElements.get(i).getAttribute("type"));
        }
    }

4.2 多层框架/窗口定位

多框架定位

如果有内嵌网页框架,需要先转到框架才能操作框架内元素。

    public static void main(String[] args) throws InterruptedException {
        ChromeOptions options=new ChromeOptions();
        //允许所有请求
        options.addArguments("--remote-allow-origins=*");
        WebDriver webDriver =new ChromeDriver(options);
        webDriver.get("https://mail.163.com/");
        //需要先定位到框架,再对框架内元素进行操作
        webDriver.switchTo().frame(webDriver.findElement(By.xpath("//iframe")));
        Thread.sleep(3000);
        webDriver.findElement(By.xpath("//input[@name=\"email\"]")).sendKeys("12345");
    }

窗口的切换

在浏览器中每个窗口都有一个句柄来标识

    public static void main(String[] args) throws InterruptedException {
        ChromeOptions options=new ChromeOptions();
        options.addArguments("--remote-allow-origins=*");
        WebDriver webDriver=new ChromeDriver(options);
        webDriver.get("Https://www.baidu.com");
        //获取当前句柄
        String handle= webDriver.getWindowHandle();
        System.out.println(handle);
        Thread.sleep(3000);
        webDriver.findElement(By.cssSelector("#s-top-left > a:nth-child(1)")).click();
        Set<String> hanles=webDriver.getWindowHandles();
        for (String h:hanles) {
            handle=h;
        }
        webDriver.switchTo().window(handle);
        Thread.sleep(3000);
        webDriver.findElement(By.cssSelector("#ww")).sendKeys("新闻联播");
        Thread.sleep(3000);
        webDriver.findElement(By.cssSelector("#s_btn_wr")).click();
    }

4.3 下拉框操作

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>下拉框</title>
</head>
<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>
    public static void main(String[] args) throws InterruptedException {
        ChromeOptions options=new ChromeOptions();
        options.addArguments("--remote-allow-origins=*");
        WebDriver webDriver=new ChromeDriver(options);
        webDriver.get("http://localhost:63342/SeleniumTest/page/test3.html?_ijt=dcl94qtill9arl6odicib469be&_ij_reload=RELOAD_ON_SAVE");
        WebElement webElement=webDriver.findElement(By.cssSelector("#ShippingMethod"));
        Select select=new Select(webElement);
        Thread.sleep(3000);
        //通过标签 value选择 
        select.selectByValue("9.03");
        Thread.sleep(3000);
        //通过下标选择,下标从零开始
        select.selectByIndex(2);
    }

4.4 弹窗操作

<!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>
    public static void main(String[] args) throws InterruptedException {
        ChromeOptions options=new ChromeOptions();
        options.addArguments("--remote-allow-origins=*");
        WebDriver webDriver=new ChromeDriver(options);
        webDriver.get("http://localhost:63342/SeleniumTest/page/test4.html?_ijt=e7mju27ab5d214o41bhvcqjf4r&_ij_reload=RELOAD_ON_SAVE");
        webDriver.findElement(By.xpath("//*[text()=\"这是一个弹窗\"]")).click();
        Thread.sleep(3000);
        //alert弹窗取消
        webDriver.switchTo().alert().dismiss();
        Thread.sleep(3000);
        webDriver.findElement(By.xpath("//*[text()=\"这是一个弹窗\"]")).click();
        Thread.sleep(3000);
        webDriver.switchTo().alert().sendKeys("软件测试");
        Thread.sleep(3000);
        webDriver.switchTo().alert().accept();
    }

4.5 文件操作

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>Title</title>
</head>
<body>
<input type="file">
</body>
</html>
    public static void main(String[] args) {
        ChromeOptions options =new ChromeOptions();
        options.addArguments("--remote-allow-origins");
        WebDriver webDriver=new ChromeDriver(options);
        webDriver.get("http://localhost:63342/SeleniumTest/page/test5.html?_ijt=klnnrj3i4pn2rhg6cl7a63qibe&_ij_reload=RELOAD_ON_SAVE");
        webDriver.findElement(By.cssSelector("input")).sendKeys("E:\\test");
    }

4.6 quit和close

quit 关闭了整个浏览器,同时会清空浏览器的cookie,close关闭的是get时获取的页面.

    public static void main(String[] args) throws InterruptedException {
        ChromeOptions options=new ChromeOptions();
        options.addArguments("--remote-allow-origins=*");
        WebDriver webDriver=new ChromeDriver(options);
        webDriver.get("https://www.baidu.com");
        webDriver.findElement(By.cssSelector("#s-top-left > a:nth-child(1)")).click();
        Thread.sleep(3000);
        //webDriver.close();
        webDriver.quit();
    }

4.7 截图

    public static void main(String[] args) throws InterruptedException, IOException {
        WebDriver webDriver=new ChromeDriver();
        webDriver.get("Https://www.baidu.com");
        webDriver.findElement(By.cssSelector("#kw")).sendKeys("软件测试");
        webDriver.findElement(By.cssSelector("#su")).click();
        Thread.sleep(3000);
        File file=((TakesScreenshot)webDriver).getScreenshotAs(OutputType.FILE);
        FileUtils.copyFile(file,new File("E:\\Code\\SeleniumTest\\picture.png"));
    }

注:截图操作需要另外引入一个common-io的依赖

相关文章
|
1月前
|
数据采集 测试技术 Python
自动化淘宝秒杀:使用Selenium WebDriver的实战指南
本文详细介绍了如何利用Selenium WebDriver自动化淘宝秒杀操作,包括环境配置、代码实现及注意事项,旨在帮助读者提升秒杀成功率,同时提醒合理使用以遵守平台规则。
82 8
|
2月前
|
Web App开发 前端开发 JavaScript
探索Python科学计算的边界:利用Selenium进行Web应用性能测试与优化
【10月更文挑战第6天】随着互联网技术的发展,Web应用程序已经成为人们日常生活和工作中不可或缺的一部分。这些应用不仅需要提供丰富的功能,还必须具备良好的性能表现以保证用户体验。性能测试是确保Web应用能够快速响应用户请求并处理大量并发访问的关键步骤之一。本文将探讨如何使用Python结合Selenium来进行Web应用的性能测试,并通过实际代码示例展示如何识别瓶颈及优化应用。
142 5
|
2月前
|
数据采集 存储 JavaScript
自动化数据处理:使用Selenium与Excel打造的数据爬取管道
本文介绍了一种使用Selenium和Excel结合代理IP技术从WIPO品牌数据库(branddb.wipo.int)自动化爬取专利信息的方法。通过Selenium模拟用户操作,处理JavaScript动态加载页面,利用代理IP避免IP封禁,确保数据爬取稳定性和隐私性。爬取的数据将存储在Excel中,便于后续分析。此外,文章还详细介绍了Selenium的基本设置、代理IP配置及使用技巧,并探讨了未来可能采用的更多防反爬策略,以提升爬虫效率和稳定性。
143 4
|
2天前
|
Web App开发 数据采集 JavaScript
CDP与Selenium相结合——玩转网页端自动化数据采集/爬取程序
本文介绍了Selenium、Chrome DevTools及Chrome DevTools Protocol (CDP) 的基本功能与应用。Selenium是一款开源自动化测试工具,适用于网页端应用程序测试和数据采集,具备跨平台特性。Chrome DevTools内置浏览器中,提供调试、分析Web应用程序的功能,包括元素、控制台、源代码和网络选项卡等。CDP是一套用于与Chromium内核浏览器通信的API,支持自动化测试和性能分析。文中还展示了Selenium与CDP结合使用的示例,如捕获网络请求数据和打印网页内容,并推荐了相关书籍和资源以供深入学习。
65 39
CDP与Selenium相结合——玩转网页端自动化数据采集/爬取程序
|
11天前
|
Web App开发 IDE JavaScript
Selenium IDE:Web自动化测试的得力助手
Selenium IDE:Web自动化测试的利器。作为开源工具,Selenium IDE支持录制与回放用户操作,适用于Chrome、Firefox等多浏览器,简化了测试流程,提升了效率,降低了自动化测试的门槛。它还支持导出多种编程语言的脚本,便于测试集成与复用。
61 19
Selenium IDE:Web自动化测试的得力助手
|
13天前
|
Web App开发 IDE 测试技术
Selenium:强大的 Web 自动化测试工具
Selenium 是一款强大的 Web 自动化测试工具,包括 Selenium IDE、WebDriver 和 Grid 三大组件,支持多种编程语言和跨平台操作。它能有效提高测试效率,解决跨浏览器兼容性问题,进行性能测试和数据驱动测试,尽管存在学习曲线较陡、不稳定等缺点,但其优势明显,是自动化测试领域的首选工具。
93 17
Selenium:强大的 Web 自动化测试工具
|
2月前
|
Java 测试技术 C#
自动化测试之美:从Selenium到Appium
【10月更文挑战第3天】在软件开发的海洋中,自动化测试如同一艘航船,引领着质量保证的方向。本文将带你领略自动化测试的魅力,从Web端的Selenium到移动端的Appium,我们将一探究竟,看看这些工具如何帮助我们高效地进行软件测试。你将了解到,自动化测试不仅仅是技术的展示,更是一种提升开发效率和产品质量的智慧选择。让我们一起启航,探索自动化测试的世界!
|
2月前
|
JavaScript 前端开发 测试技术
精通Selenium:从基础到高级的网页自动化测试策略
【10月更文挑战第6天】随着Web应用变得越来越复杂,手动进行功能和兼容性测试变得既耗时又容易出错。自动化测试因此成为了现代软件开发不可或缺的一部分。Selenium是一个强大的工具集,它支持多种编程语言(包括Python),允许开发者编写脚本来模拟用户与Web页面的交互。本文将带领读者从Selenium的基础知识出发,逐步深入到高级的应用场景,通过丰富的代码示例来展示如何高效地进行网页自动化测试。
500 5
|
1月前
|
Web App开发 设计模式 JavaScript
自动化测试之美:如何利用Selenium实现Web应用的高效测试
【10月更文挑战第29天】在软件开发的世界中,测试是确保产品质量的关键步骤。本文将带你了解如何使用Selenium这一强大的自动化测试工具,提高Web应用测试的效率和准确性。通过实际案例,我们将探索Selenium的核心功能及其在现代软件开发中的应用,旨在帮助读者掌握自动化测试的精髓,从而提升软件测试工作的整体效能。
44 0
|
2月前
|
Web App开发 缓存 Linux
高效Selenium测试技巧:轻松控制已开启的浏览器
【10月更文挑战第13天】在进行Selenium测试时,通常会启动新浏览器实例,但有时需要控制已开启的浏览器,以节省时间并更真实地模拟用户行为。这可通过设置Chrome为可远程控制并使用`Remote WebDriver`连接实现。需在启动Chrome时添加`--remote-debugging-port`参数,并通过Python脚本中的`webdriver.Remote`连接至指定端口。此外,还可利用会话ID(Session ID)重新连接浏览器,提高测试灵活性。需要注意浏览器版本兼容性及元素定位稳定性等问题,确保测试准确性和一致性。
389 1
下一篇
DataWorks