• Selenium的使用


    一、基础

    1、特点

    selenium 是web中基于UI的自动化测试工具,它支持多平台、多语言、多浏览器,还有丰富的API。

    2、原理

    自动化脚本代码会创建一个http请求发送给浏览器驱动进行解析,浏览器驱动会操控浏览器执行测试,浏览器接着会返回给http server并传给浏览器驱动,浏览器驱动收到后就会把结果返回给脚本。

     二、Selenium API

    定位元素

    1、CSS selector

    1.1、id 选择器(#+id值)

    1.2、类选择器(.+类名)

    1.3、标签选择器(input 是标签名)

    1.4、后代选择器(div form span #kw (子选择器和父选择器纸质件用空格隔开))

    2、XPath定位元素

    2.1、绝对路径:(以单斜杠“/”开头)

    2.2、相对路径:(以双斜杠“//”开头)

    (1)相对路径+索引

    PS:不加索引的话默认索引为1 

    (2)相对路径+元素

    (3)相对路径+通配符

    (4)相对路径+部分元素定位

    (5)相对路径+文本定位

     2.3、xpath 的缺点:定位元素效率很低

    (1)性能问题:在匹配大量数据时,XPath 的性能可能会比较低。因为 XPath 是基于遍历文档树来实现节点查找的,所以当文档树非常大时,XPath 可能会导致性能问题。

    (2)语法复杂:XPath 语法相对于 CSS Selector 和其他选择器来说比较复杂,需要掌握较多的语法规则才能编写出有效的 XPath 表达式。

    (3)对浏览器的支持度较低:在某些浏览器中,XPath 的支持度可能不如 CSS Selector,需要更高版本的浏览器才能支持 XPath。

    (4)学习成本较高:XPath 语法比较复杂,需要学习较多的 XPath 规则和操作符,需要花费较多的时间和精力来掌握。

    (5)可读性较差:XPath 表达式较为冗长,可读性不如 CSS Selector 和其他选择器。

    3、应用

    3.1、网页的打开与关闭

    1. private static void test01() {
    2. ChromeOptions options = new ChromeOptions();//创建了一个option对象,用来给请求设置一些参数
    3. options.addArguments("--remote-allow-origins=*");//允许所有请求
    4. WebDriver webDriver = new ChromeDriver(options);//创建一个驱动
    5. webDriver.get("https://www.baidu.com");//打开百度网页
    6. webDriver.quit();//关闭网页
    7. }

    3.2、定位元素的使用

    1. private static void test02() throws InterruptedException {
    2. ChromeOptions options=new ChromeOptions();
    3. options.addArguments("--remote-allow-origins=*");
    4. WebDriver webDriver=new ChromeDriver(options);
    5. webDriver.get("https://www.baidu.com/");//打开百度
    6. // webDriver.findElement(By.cssSelector("#kw")).sendKeys("selenium");//输入内容
    7. // webDriver.findElement(By.cssSelector("#su")).click();//点击“百度一下”按钮
    8. //PS:右键-copy-selector,即可自动粘贴得到CSS的定位元素。右键-copy-xpath,即可自动粘贴得到xpath的定位元素。
    9. // webDriver.findElement(By.xpath("//*[@id=\"su\"]")).click();
    10. webDriver.findElement(By.cssSelector("#kw")).sendKeys("软件测试");//输入内容
    11. webDriver.findElement(By.cssSelector("#su")).click();//点击“百度一下”按钮
    12. webDriver.findElement(By.cssSelector("#su")).submit();
    13. List webElements = webDriver.findElements(By.cssSelector("em"));//找到所有的“软件测试”文案对应的元素
    14. sleep(4000);
    15. if(String.valueOf(webElements.size()).equals("0"))
    16. System.out.println("测试不通过");
    17. else System.out.println("测试通过");
    18. }

    3.3、使用 getAttribute( ) 来获取文本元素

    1. private static void test03() throws InterruptedException {
    2. ChromeOptions options = new ChromeOptions();//创建对象
    3. options.addArguments("--remote-allow-origins=*");//允许请求
    4. WebDriver webDriver = new ChromeDriver(options);//创建驱动
    5. webDriver.get("https://www.baidu.com");//打开网址
    6. System.out.println(webDriver.findElement(By.cssSelector("#su")).getAttribute("value"));//获取元素文本
    7. sleep(3000);
    8. }

    3.4、休眠等待

    1. private static void test05() throws InterruptedException {
    2. ChromeOptions options = new ChromeOptions();//创建了一个option对象,用来给请求设置一些参数
    3. options.addArguments("--remote-allow-origins=*");//允许所有请求
    4. WebDriver webDriver = new ChromeDriver(options);//创建一个驱动
    5. webDriver.get("https://www.baidu.com");//打开百度网页
    6. webDriver.findElement(By.cssSelector("#kw")).sendKeys("测试");//找到搜索输入框
    7. webDriver.findElement(By.cssSelector("#kw")).click();//点击搜索
    8. sleep(2000);
    9. webDriver.findElement(By.cssSelector("#kw")).clear();//清空
    10. }

    3.5、隐式等待

    1. private static void test06() {
    2. ChromeOptions options = new ChromeOptions();//创建了一个option对象,用来给请求设置一些参数
    3. options.addArguments("--remote-allow-origins=*");//允许所有请求
    4. WebDriver webDriver = new ChromeDriver(options);//创建一个驱动
    5. webDriver.get("https://www.baidu.com");//打开百度网页
    6. webDriver.findElement(By.cssSelector("#kw")).sendKeys("测试");//找到搜索输入框
    7. webDriver.findElement(By.cssSelector("#kw")).click();//点击搜索
    8. webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);
    9. webDriver.findElement(By.cssSelector("#kw")).clear();//清空
    10. webDriver.quit();
    11. }

    3.6、显示等待

    1. private static void test13() throws InterruptedException {
    2. WebDriver webDriver = new ChromeDriver();
    3. // webDriver.get("https://www.baidu.com/");
    4. webDriver.get("http://localhost:63342/Selenium01/src/main/Page/test02.html?_ijt=2vluji84bvnav2oi5ag029tntc&_ij_reload=RELOAD_ON_SAVE");
    5. sleep(3000);
    6. WebDriverWait wait = new WebDriverWait(webDriver, 50);
    7. webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);
    8. // wait.until(ExpectedConditions.titleIs("百度一下,你就知道"));
    9. wait.until(ExpectedConditions.textToBe(By.cssSelector("h3"), "frame"));
    10. webDriver.quit();
    11. }

    PS:显示等待和隐式等待:

    相同点:都属于只能等待。

    区别:隐式等待等待的是页面上的所有元素;显示等待条件满足即可。

    3.7、获取当前页面的 url

    1. private static void test07() {
    2. ChromeOptions options = new ChromeOptions();//创建了一个option对象,用来给请求设置一些参数
    3. options.addArguments("--remote-allow-origins=*");//允许所有请求
    4. WebDriver webDriver = new ChromeDriver(options);//创建一个驱动
    5. webDriver.get("https://www.baidu.com/");//打开百度网页
    6. String url=webDriver.getCurrentUrl();//获取当前页面的Url
    7. System.out.println(url);
    8. System.out.println(webDriver.getCurrentUrl());
    9. if(url.equals("https://www.baidu.com/"))
    10. System.out.println("successfully!");
    11. else System.out.println("failed!");
    12. }

    3.8、获得页面题目

    1. private static void test08() {
    2. ChromeOptions options = new ChromeOptions();//创建了一个option对象,用来给请求设置一些参数
    3. options.addArguments("--remote-allow-origins=*");//允许所有请求
    4. WebDriver webDriver = new ChromeDriver(options);//创建一个驱动
    5. webDriver.get("https://www.baidu.com/");//打开百度网页
    6. String tittle = webDriver.getTitle();
    7. if(tittle.equals(("百度一下,你就知道")))
    8. System.out.println("successfully!");
    9. else System.out.println("failed!");
    10. webDriver.quit();
    11. }

    3.9、页面操作

    1. private static void test09() {
    2. ChromeOptions options = new ChromeOptions();//创建了一个option对象,用来给请求设置一些参数
    3. options.addArguments("--remote-allow-origins=*");//允许所有请求
    4. WebDriver webDriver = new ChromeDriver(options);//创建一个驱动
    5. webDriver.get("https://www.baidu.com/");//打开百度网页
    6. //webDriver.manage().window().maximize();//最大化
    7. //webDriver.manage().window().fullscreen();//全屏
    8. //webDriver.manage().window().setSize(new Dimension(500,500));//设置长宽
    9. webDriver.quit();
    10. }
    1. private static void test10() throws InterruptedException {
    2. ChromeOptions options = new ChromeOptions();//创建了一个option对象,用来给请求设置一些参数
    3. options.addArguments("--remote-allow-origins=*");//允许所有请求
    4. WebDriver webDriver = new ChromeDriver(options);//创建一个驱动
    5. webDriver.get("https://www.baidu.com/");//打开百度网页
    6. webDriver.findElement(By.cssSelector("#kw")).sendKeys("测试");
    7. webDriver.findElement(By.cssSelector("#su")).click();
    8. sleep(3000);
    9. webDriver.navigate().back();//返回上个页面
    10. sleep(3000);
    11. webDriver.navigate().forward();//返回下个页面
    12. sleep(3000);
    13. webDriver.navigate().refresh();//页面刷新
    14. }

    3.10、键盘操作

    1. private static void test11() throws InterruptedException {
    2. ChromeOptions options = new ChromeOptions();//创建了一个option对象,用来给请求设置一些参数
    3. options.addArguments("--remote-allow-origins=*");//允许所有请求
    4. WebDriver webDriver = new ChromeDriver(options);//创建一个驱动
    5. webDriver.get("https://www.baidu.com/");//打开百度网页
    6. webDriver.findElement(By.cssSelector("#kw")).sendKeys("测试");
    7. webDriver.findElement(By.cssSelector("#kw")).sendKeys(Keys.CONTROL+"A");//全选
    8. sleep(3000);
    9. webDriver.findElement(By.cssSelector("#kw")).sendKeys(Keys.CONTROL+"x");//剪贴
    10. sleep(3000);
    11. webDriver.findElement(By.cssSelector("#kw")).sendKeys(Keys.CONTROL+"v");//粘贴
    12. sleep(3000);
    13. webDriver.findElement(By.cssSelector("#kw")).sendKeys(Keys.CONTROL+"c");//复制
    14. sleep(3000);
    15. webDriver.findElement(By.cssSelector("#su")).click();
    16. }

    3.11、

    (1)选择框

    1. private static void page01() {
    2. // 创建一个浏览器驱动
    3. WebDriver webDriver = new ChromeDriver();
    4. // 打开网页
    5. webDriver.get("http://localhost:63342/demo1/src/main/Page/test01.html?_ijt=cbdunvqogtv9nna66fteho4pe2&_ij_reload=RELOAD_ON_SAVE");
    6. // 获取到所有的input标签对应的元素
    7. List webElements = webDriver.findElements(By.cssSelector("input"));
    8. // 判断每一个input标签里面type值是checkbox进行点击,否则不点击
    9. for(int i = 0; i < webElements.size(); i++) {
    10. if(webElements.get(i).getAttribute("type").equals("checkbox")) {
    11. webElements.get(i).click();
    12. } else {
    13. }
    14. }
    15. }
    1. <html>
    2. <head>
    3. <meta http-equiv="content-type" content="text/html;charset=utf-8" />
    4. <title>Checkboxtitle>
    5. head>
    6. <body>
    7. <h3>checkboxh3>
    8. <div class="well">
    9. <form class="form-horizontal">
    10. <div class="control-group">
    11. <label class="control-label" for="c1">checkbox1label>
    12. <div class="controls">
    13. <input type="checkbox" id="c1" />
    14. div>
    15. div>
    16. <div class="control-group">
    17. <label class="control-label" for="c2">checkbox2label>
    18. <div class="controls">
    19. <input type="checkbox" id="c2" />
    20. div>
    21. div>
    22. <div class="control-group">
    23. <label class="control-label" for="c3">checkbox3label>
    24. <div class="controls">
    25. <input type="checkbox" id="c3" />
    26. div>
    27. div>
    28. <div class="control-group">
    29. <label class="control-label" for="r1">radiolabel>
    30. <div class="controls">
    31. <input type="radio" id="r1" />
    32. div>
    33. div>
    34. <div class="control-group">
    35. <label class="control-label" for="r2">radiolabel>
    36. <div class="controls">
    37. <input type="radio" id="r2" />
    38. div>
    39. div>
    40. form>
    41. div>
    42. body>
    43. html>

     (2)一个框

    1. private static void page02() {
    2. // 创建浏览器驱动
    3. WebDriver webDriver = new ChromeDriver();
    4. // 打开网页
    5. webDriver.get("http://localhost:63342/Selenium01/src/main/Page/test02.html?_ijt=2vluji84bvnav2oi5ag029tntc&_ij_reload=RELOAD_ON_SAVE");
    6. // 找到click元素点击
    7. webDriver.switchTo().frame("f1");
    8. webDriver.findElement(By.cssSelector("body > div > div > a")).click();
    9. // 目标元素不在iframe,可以直接获取
    10. // String h3_text = webDriver.findElement(By.cssSelector("body > div > div > h3")).getText();
    11. // System.out.println(h3_text);
    12. }
    1. <html>
    2. <head>
    3. <meta http-equiv="content-type" content="text/html;charset=utf-8" />
    4. <title>frametitle>
    5. <link href="https://netdna.bootstrapcdn.com/twitter-bootstrap/2.3.2/css/bootstrap-combined.min.css" rel="stylesheet" />
    6. <script type="text/javascript">$(document).ready(function(){
    7. });
    8. script>
    9. head>
    10. <body>
    11. <div class="row-fluid">
    12. <div class="span10 well">
    13. <h3>frameh3>
    14. <iframe id="f1" src="inner.html" width="800" , height="600">iframe>
    15. div>
    16. div>
    17. body>
    18. <script src="https://netdna.bootstrapcdn.com/twitter-bootstrap/2.3.2/js/bootstrap.min.js">script>
    19. html>
    1. <html>
    2. <head>
    3. <meta http-equiv="content-type" content="text/html;charset=utf-8" />
    4. <title>innertitle>
    5. head>
    6. <body>
    7. <div class="row-fluid">
    8. <div class="span6 well">
    9. <h3>innerh3>
    10. <iframe id="f2" src="https://www.baidu.com/"
    11. width="700"height="500">iframe>
    12. <a href="javascript:alert('watir-webdriver better than selenium webdriver;')">clicka>
    13. div>
    14. div>
    15. body>
    16. html>

    (3)下拉框

    1. private static void page03() {
    2. // 创建浏览器驱动
    3. WebDriver webDriver = new ChromeDriver();
    4. // 打开网页
    5. webDriver.get("http://localhost:63342/demo1/src/main/Page/test02.html?_ijt=hkofpkrsk74h8dbbip255s6dm3&_ij_reload=RELOAD_ON_SAVE");
    6. // 操作下拉框
    7. Select select = new Select(webDriver.findElement(By.cssSelector("#ShippingMethod")));
    8. // select.selectByValue("12.51");
    9. select.selectByIndex(2);
    10. }
    1. <html>
    2. <body>
    3. <select id="ShippingMethod" onchange="updateShipping(options[selectedIndex]);" name="ShippingMethod">
    4. <option value="12.51">UPS Next Day Air ==> $12.51option>
    5. <option value="11.61">UPS Next Day Air Saver ==> $11.61option>
    6. <option value="10.69">UPS 3 Day Select ==> $10.69option>
    7. <option value="9.03">UPS 2nd Day Air ==> $9.03option>
    8. <option value="8.34">UPS Ground ==> $8.34option>
    9. <option value="9.25">USPS Priority Mail Insured ==> $9.25option>
    10. <option value="7.45">USPS Priority Mail ==> $7.45option>
    11. <option value="3.20" selected="">USPS First Class ==> $3.20option>
    12. select>
    13. body>
    14. html>

    (4) alert 弹窗操作

    1. private static void page04() throws InterruptedException {
    2. WebDriver webDriver = new ChromeDriver();
    3. webDriver.get("http://localhost:63342/demo1/src/main/Page/test04.html?_ijt=hkofpkrsk74h8dbbip255s6dm3&_ij_reload=RELOAD_ON_SAVE");
    4. webDriver.findElement(By.cssSelector("button")).click();
    5. sleep(3000);
    6. // webDriver.switchTo().alert().accept();// alert弹窗确定
    7. // webDriver.switchTo().alert().dismiss();// alert弹窗取消
    8. webDriver.switchTo().alert().sendKeys("你好");
    9. webDriver.switchTo().alert().accept();
    10. }
    1. html>
    2. <html lang="en">
    3. <head>
    4. <meta charset="UTF-8">
    5. <title>Titletitle>
    6. head>
    7. <body>
    8. <button onclick="Click()">这是一个弹窗button>
    9. body>
    10. <script type="text/javascript">
    11. function Click() {
    12. let name = prompt("请输入姓名:");
    13. let parent = document.querySelector("body");
    14. let child = document.createElement("div");
    15. child.innerHTML = name;
    16. parent.appendChild(child)
    17. }
    18. script>
    19. html>

    (5)文件上传

    1. private static void page05() {
    2. WebDriver webDriver = new ChromeDriver();
    3. webDriver.get("http://localhost:63342/Selenium01/src/main/Page/test05.html?_ijt=tmsdfhdm1lf1ururkjefb479tj&_ij_reload=RELOAD_ON_SAVE");
    4. // 找到按钮(上传文件的按钮),输入一个字符串
    5. webDriver.findElement(By.cssSelector("input")).sendKeys("D:\\dowloadSoftware\\Chrome");
    6. }
    1. html>
    2. <html lang="en">
    3. <head>
    4. <meta charset="UTF-8">
    5. <title>Titletitle>
    6. head>
    7. <body>
    8. <input type="file">
    9. body>
    10. html>

    3.12、浏览器滚动条的操作

    1. private static void test14() throws InterruptedException {
    2. Duration timeOut = Duration.ofMillis(5000);
    3. WebDriver webDriver=new ChromeDriver();
    4. webDriver.get("https://www.baidu.com/");
    5. webDriver.findElement(By.cssSelector("#kw")).sendKeys("软件");
    6. webDriver.findElement(By.cssSelector("#su")).click();
    7. sleep(3000);
    8. ((JavascriptExecutor)webDriver).executeScript("document.documentElement.scrollTop=10000;");
    9. }

    3.13、浏览器的关闭

    close:关闭的是当前页面。不会清除cookie这些信息。

    quit:关闭的是浏览器。会清除cookie这些信息。

    1. private static void test16() {
    2. WebDriver webDriver = new ChromeDriver();
    3. webDriver.get("https://www.baidu.com/");
    4. webDriver.findElement(By.cssSelector("#s-top-left > a:nth-child(1)")).click();
    5. webDriver.close();
    6. }
    7. private static void test15() throws InterruptedException, IOException {
    8. WebDriver webDriver = new ChromeDriver();
    9. webDriver.get("http://localhost:63342/demo1/src/main/Page/test02.html?_ijt=hkofpkrsk74h8dbbip255s6dm3&_ij_reload=RELOAD_ON_SAVE");
    10. sleep(5000);
    11. File src_file = ((TakesScreenshot)webDriver).getScreenshotAs(OutputType.FILE);
    12. FileUtils.copyFile(src_file, new File("D:\\code-bit-2023\\test\\jietu.png"));
    13. webDriver.quit();
    14. }

    3.14、窗口切换

    1. private static void test17() {
    2. WebDriver webDriver = new ChromeDriver();
    3. webDriver.get("https://www.baidu.com/");
    4. webDriver.findElement(By.cssSelector("#s-top-left > a:nth-child(1)")).click();
    5. // 获取到浏览器所有的窗口句柄
    6. Set handles = webDriver.getWindowHandles();
    7. String target_handle = "";
    8. for(String handle:handles) {
    9. target_handle = handle;
    10. }
    11. System.out.println(target_handle);
    12. webDriver.switchTo().window(target_handle);
    13. webDriver.findElement(By.cssSelector("#header-link-wrapper > li:nth-child(3) > a")).click();
    14. }

  • 相关阅读:
    python基础练习 序列求和
    那些利用假期学习的职场人,后来都怎么样了?
    【建议背诵】软考高项考试案例简答题汇总~(1)
    论文阅读【时间序列】TimeMixer (ICLR2024)
    潮玩游戏潮玩宇宙大逃杀游戏
    让充电器秒供多个快充口,乐得瑞推出1拖2功率分配快充线方案
    docker笔记9:Docker-compose容器编排
    Python图像处理:局部直方图均衡化和自动色彩均衡化
    JVM内存模型(JMM)
    如何阅读论文?
  • 原文地址:https://blog.csdn.net/qq_56324572/article/details/130854425