selenium - web自动化测试

本文介绍了如何在Java中使用Selenium框架和MicrosoftEdgeWebDriver进行网页自动化测试,包括下载和配置webdriver、创建Maven项目、基础方法如元素定位、操作、等待和浏览器控制等,以及有头和无头模式的区别。

一、下载对应浏览器的webdriver,比如edge的: 

Microsoft Edge WebDriver - Microsoft Edge Developericon-default.png?t=N7T8https://developer.microsoft.com/zh-cn/microsoft-edge/tools/webdriver/解压,找到msedgedriver.exe,将其放到 Java 系统环境变量下,例如 : 将其放到 JDK 的 bin 目录下

启动发现edge浏览器webdriver请求地址是127.0.0.1 : 9515

二、创建Maven项目

引入依赖

<dependency>
    <groupId>org.seleniumhq.selenium</groupId>
    <artifactId>selenium-java</artifactId>
    <version>4.0.0</version>
</dependency>

首个测试:这里https://www.baidu.com这个网站点击百度一下不会跳转新标签页

public class FirstAutoTest {
    // 百度网址搜索陈伟霆
    public void chenWeiTingTest() throws InterruptedException {
        // 创建驱动实例, 创建会话(打开浏览器)
        EdgeDriver driver = new EdgeDriver();
        Thread.sleep(3000);
        // 在浏览器找到百度网址, 访问百度首页
        driver.get("https://www.baidu.com");
        Thread.sleep(1000);
        // 找到百度首页输入框元素, 并输入关键词 "陈伟霆"
        driver.findElement(By.cssSelector("#kw")).sendKeys("陈伟霆");
        Thread.sleep(1000);
        // 找到百度首页的 "百度一下" 按钮, 并点击一下
        driver.findElement(By.cssSelector("#su")).click();
        Thread.sleep(3000);
        // 结束会话, 关闭浏览器
        driver.quit();
    }
}
public class RunAutoTest {
    public static void main(String[] args) throws InterruptedException {
        FirstAutoTest firstAutoTest = new FirstAutoTest();
        firstAutoTest.chenWeiTingTest();
    }
}

三、selenium 基础方法

1.查找页面元素

driver.findElement()

driver.findElements()

  • 当元素可以在页面中找到, 程序正确退出

  • 当元素在页面中找不到时, 程序执行报错 >

参数:By.cssSelector("页面元素")

页面元素可以是selector 或 xpath

xpath 语法

层级 : / 代表子集, // 代表跳级
属性 : @
函数 : contains()...

返回值 : webElement   /    List<WebElement>

2.输入文本

driver.findElement(By.cssSelector("#kw")).sendKeys("陈伟霆");

3.点击 click

driver.findElement(By.cssSelector("#su")).click();

4.提交

submit 相当于通过回车键提交, 但是 selenium 官方不推荐使用 submit, 更推荐 click. 因为 submit 仅适用于表单元素, 而且能使用 submit 提交, 就一定能使用 click 代替, 而反过来不行.

5.清除

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

 

6.获取文本

driver.findElement(By.cssSelector("#su")).getText()

7.获取属性对应的值

System.out.println(driver.findElement(By.cssSelector("#su")).getAttribute("id")) 

8.获取当前标签页面标题和URL

获取标题 : driver.getTitle()
获取URL : driver.getCurrentUrl()

窗口大小的设置

  1. driver.manage().window().maximize();

  2. driver.manage().window().minimize();

  3. driver.manage().window().fullscreen();
  4. driver.manage().window().setSize(new Dimension(1024, 768));

9.窗口的切换

当浏览器每次打开一个标签页的时候, 会自动的给每个标签页进行标识, 这个标识我们称之为 "句柄"

driver对象会拿着旧标签页的句柄

获取当前页面的句柄

String curHandle = driver.getWindowHandle()

获取所有页面的句柄

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

跳转到新标签页

String curHandle = driver.getWindowHandle();
System.out.println("当前句柄 : " +curHandle);
Set<String> handles = driver.getWindowHandles();
for(String handle : handles) {
    // 如果不是当前页面的句柄, 就切换窗口
    if(handle != curHandle) {
        driver.switchTo().window(handle);
    }
}

10.屏幕截图

引入依赖

<dependency>
    <groupId>commons-io</groupId>
    <artifactId>commons-io</artifactId>
    <version>2.6</version>
</dependency>

// 屏幕截图 (保存现场)
File srcFile = driver.getScreenshotAs(OutputType.FILE);
String filename = "my.png";
FileUtils.copyFile(srcFile, new File(filename));

11.等待

程序执行速度比浏览器渲染速度要快很多,查找页面元素时元素还没渲染出来呢,就会报错找不到对应的元素。

强制等待

Thread.sleep()

隐式等待

 隐式等待会作用于 driver 的整个生命周期. 虽然代码写在前面, 但是隐式等待会一直轮询判断元素是否存在, 如果元素存在, 并且在 1ms 就找到了, 就不会等待三秒, 直接就往下执行了; 如果不存在该元素, 就在设置好的时间里轮询等待即可, 时间一过, 元素还没找到, 程序执行就会报错.

EdgeDriver driver = new EdgeDriver();
// 添加隐式等待
driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(3));
driver.get("https://www.baidu.com");
driver.findElement(By.cssSelector("#kw")).sendKeys("陈伟霆");
driver.findElement(By.cssSelector("#su")).click();
// 获取新打开页面的元素
driver.findElement(By.cssSelector("#\\31  > div > div > div > div > div.cos-row.row-text_Johh7.row_5y9Az > div > a > div > p > span > span"));
// 退出
driver.quit();

显式等待

private EdgeDriver driver = new EdgeDriver();
    
public void windowController() throws InterruptedException, IOException { 
    driver.get("https://www.baidu.com");
    driver.findElement(By.cssSelector("#kw")).sendKeys("陈伟霆");
    driver.findElement(By.cssSelector("#su")).click();
    // 添加显示等待
    new WebDriverWait(driver, Duration.ofSeconds(5))
            .until(driver->driver.findElement(By.cssSelector("#\\31  > div > div > div > div > div.cos-row.row-text_Johh7.row_5y9Az > div > a > div > p > span > span")));
    driver.quit();
}

12.浏览器导航

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

driver.navigate().to("https//www.baidu.com");

driver.navigate().back();

driver.navigate().forward();

driver.navigate().refresh();

13.处理弹窗

Alert alert = driver.switchTo().alert();

alert.sendKeys("abcdef~");

alert.accept();

alert.dismiss();

1. 警告弹窗中, 切换到弹窗,调用 accept().
2. 确认弹窗中, 切换到弹窗, 调用 accept() 或 dismiss().
3. 提示弹窗中, 切换到弹窗, 可以先输入文本, 调用 sendKeys(), 然后调用 accept 或者 dismiss.
但是 sendKeys() 在页面上看不到输入文本的执行效果
 

虽然警告弹窗只有确认按钮, 但是 accept 和 dismiss 都能处理. 虽然警告弹窗和确认弹窗都没有输入文本的地方, 但如果要执行 alert.sendKKeys(), 代码也不会报错.

14.选择框

WebElement ele = driver.findElement(By.cssSelector("#ShippingMethod"));

// 先创建选择框对象

Select select = new Select(ele);

// 根据文本来选择

select.selectByVisibleText("UPS Next Day Air ==> $12.51");

 

// 根据属性值来选择

select.selectByValue("12.51");

// 根据序号来选择 (序号从 0 开始)

select.selectByIndex(1);

15.执行脚本

driver.executeScript("var texts = document.querySelector('#kw'); texts.value = 'abcdef'");

16.文件上传

driver.findElement(By.cssSelector("body > div > div > input[type=file]")).sendKeys("D:\\bit-test\\selenium-html\\upload.html");

 

四、有头模式(操作浏览器看得见/前台)/无头模式(看不见/后台)

public void noHeadController() {
    // 先创建选项对象, 然后再设置浏览器参数 (无头模式)
    EdgeOptions options = new EdgeOptions();
    options.addArguments("-headless");
    EdgeDriver driver = new EdgeDriver(options);
    ...
    driver.quit();
}

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值