当前位置:   article > 正文

自动化测试脚本 Selenium WebDriver(Java)常用 API 汇总

自动化测试脚本 Selenium WebDriver(Java)常用 API 汇总

一.引入依赖

  1. <dependency> 
  2.   <groupId>org.seleniumhq.selenium</groupId>  
  3.   <artifactId>selenium-java</artifactId>  
  4.   <version>3.141.59</version> 
  5. </dependency>

二.示例

  1. /**
  2.  * @author 公众号:伤心的辣条
  3.  * @version 创建时间:2023/10
  4.  * 类说明:自动化测试脚本 Selenium WebDriver(Java)常用 API 汇总
  5.  */
  6. public class SeleniumTest {
  7.     public static void main(String[] args) throws InterruptedException {
  8.         ChromeOptions options = new ChromeOptions();
  9.         //允许任何来源的远程连接,这样可以避免一些跨域问题。
  10.         options.addArguments("--remote-allow-origins=*");
  11.         //初始化 chrome 浏览器 driver 对象
  12.         WebDriver webDriver = new ChromeDriver(options);
  13.         // 访问指定网页
  14.         webDriver.get("https://juejin.cn");
  15.         //开始操作页面
  16.         //……
  17.     }
  18. }

三.操作其它浏览器

  1. // Firefox浏览器
  2. WebDriver driver = new FirefoxDriver();  
  3. // Edge浏览器
  4. WebDriver driver = new EdgeDriver();  
  5. // Internet Explorer浏览器
  6. WebDriver driver = new InternetExplorerDriver();  

四.元素定位

要想操作一个对象,首先应该识别这个对象。通过下面的 API,可以获取页面上的标签对象,从而来操作它们。

1.CSS选择器定位

css选择器定位,在css中有标签选择器、类选择器、id选择器、后代选择器、子选择器、并集选择器……它们对应的语法在在这里也适用。

  1. /**
  2.  * @author 公众号:伤心的辣条
  3.  * @version 创建时间:2023/10
  4.  * 类说明:自动化测试脚本 Selenium WebDriver(Java)常用 API 汇总
  5.  */
  6. public class SeleniumTest {
  7.     public static void main(String[] args) throws InterruptedException {
  8.         ChromeOptions options = new ChromeOptions();
  9.         //允许任何来源的远程连接,这样可以避免一些跨域问题。
  10.         options.addArguments("--remote-allow-origins=*");
  11.         WebDriver webDriver = new ChromeDriver(options);
  12.         // 访问指定网页
  13.         webDriver.get("https://juejin.cn");
  14.         //css 选择器 方式1:id选择
  15.         WebElement element = webDriver.findElement(By.cssSelector("#elementId"));
  16.         //css 选择器 方式2:类选择
  17.         WebElement element2 = webDriver.findElement(By.cssSelector(".elementClass"));
  18.         //css 选择器 方式3:后代选择
  19.         WebElement element2 = webDriver.findElement(By.cssSelector(".elementClass1 .elementClass2……"));
  20.         //其它方式
  21.         ……
  22.     }
  23. }

案例:我想在掘金主页搜索框中输入selenium并点击搜索。

先看掘金主页源码中搜索框、搜索按钮的标签属性。

图片

图片

  1. /**
  2.  * @author 公众号:伤心的辣条
  3.  * @version 创建时间:2023/10
  4.  * 类说明:自动化测试脚本 Selenium WebDriver(Java)常用 API 汇总
  5.  */
  6. public class SeleniumTest {
  7.     public static void main(String[] args) {
  8.         ChromeOptions options = new ChromeOptions();
  9.         //允许任何来源的远程连接,这样可以避免一些跨域问题。
  10.         options.addArguments("--remote-allow-origins=*");
  11.         WebDriver webDriver = new ChromeDriver(options);
  12.         // 访问指定网页
  13.         webDriver.get("https://juejin.cn");
  14.         //获取搜索框
  15.         WebElement input = webDriver.findElement(By.cssSelector(".search-input"));
  16.         //输入值
  17.         input.sendKeys("java");
  18.         //获取搜索按钮
  19.         WebElement seach = webDriver.findElement(By.cssSelector(".seach-icon-container"));
  20.         //点击该元素
  21.         seach.click();
  22.     }
  23. }

为了简洁,文章后面就不放查找标签class属性的截图了,知道怎么查找就行了。

2.id定位

这个跟css选择器定位 类似,可以作为它的简便写法

webDriver.findElement(By.id("页面元素的id值"));

3.name 定位

如果这个元素有name属性,并且元素的name命名在整个页面是唯一的,那么我们可以用name来定位这个元素。

webDriver.findElement(By.name("页面元素的name值"));

4.className、tagName定位

className就是根据类名字选择,tagName是根据标签名选择。

  1. webDriver.findElement(By.className("class的名字"));
  2. webDriver.findElement(By.tagName("标签的名字"));

5.linkText定位

对一个文字链接进行定位,我们可以通过链接内容,也就是link text来定位。

  1. // 获取链接元素
  2. WebElement link = webDriver.findElement(By.linkText("链接文本"));

示例:自动进入首页的“后端”页面

图片

  1. /**
  2.  * @author 公众号:伤心的辣条
  3.  * @version 创建时间:2023/10
  4.  * 类说明:自动化测试脚本 Selenium WebDriver(Java)常用 API 汇总
  5.  */
  6. public class SeleniumTest {
  7.     public static void main(String[] args) {
  8.         ChromeOptions options = new ChromeOptions();
  9.         //允许任何来源的远程连接,这样可以避免一些跨域问题。
  10.         options.addArguments("--remote-allow-origins=*");
  11.         WebDriver webDriver = new ChromeDriver(options);
  12.         // 访问指定网页
  13.         webDriver.get("https://juejin.cn");
  14.         //获取链接元素
  15.         WebElement link = webDriver.findElement(By.linkText("后端"));
  16.         //点击元素,自动进入首页的“后端”页面
  17.         link.click();
  18.     }
  19. }

6.partialLinkText定位

只用链接的一部分文字进行匹配。

  1. // 获取带“text”的链接
  2. WebElement link = webDriver.findElement(By.partialLinkText("text"));
  3. // 获取所有的带“text”的链接
  4. List<WebElement> articles =  webDriver.findElements(By.partialLinkText("text"));

注意,这里适用的是findElements,而不是findElement。当获取的元素有多个的时候就使用findElements

7.xpath 定位

webDriver.findElement(By.xpath("XPath定位表达式"));

XPath是一种在XML文档中定位元素的语言。因为HTML可以看做XML的一种实现,所以可以使用这种语言在web应用中定位元素。

图片

比如//form//span[1]/input表示选择文档中所有的<form>元素,然后在每个<form>元素内部找到第一个<span>元素,然后再在这个<span>元素内部选择一个<input>元素。可以在页面中快速地获取xpath,就以搜索框为例。

图片

WebElement element1 = webDriver.findElement(By.xpath("//*[@id=\"juejin\"]/div[1]/div[1]/header/div/nav/ul/ul/li[1]/ul/li[1]/form/input"));

五.操作对象

定位只是第一步,定位之后需要对这个元素进行操作。它们都是WebElement接口的方法。

  • sendKeys():模拟键盘向输入框里输入内容。

  • click():用于单击一个元素,前提是它是可以被单击的对象。

  • getSize():返回元素的尺寸。

  • getText():获取元素的文本。

  • getAttribute():获得属性的值。

  • isDisplayed():查看该元素是否用户可见,返回值为布尔值。

  • submit():用于提交表单,前提必须得有<form>标签。

  • clear():用于清除文本输入框中的内容。

六.元素等待方式

案例:百度搜索,在搜索框中输入mrjade,统计当前页显示出来多少词条。

  1. /**
  2.  * @author 公众号:伤心的辣条
  3.  * @version 创建时间:2023/10
  4.  * 类说明:自动化测试脚本 Selenium WebDriver(Java)常用 API 汇总
  5.  */
  6. public class SeleniumTest {
  7.     public static void main(String[] args) {
  8.         ChromeOptions options = new ChromeOptions();
  9.         //允许任何来源的远程连接,这样可以避免一些跨域问题。
  10.         options.addArguments("--remote-allow-origins=*");
  11.         WebDriver webDriver = new ChromeDriver(options);
  12.         webDriver.get("https://baidu.com");
  13.         //css 选择器,选择输入框
  14.         WebElement input = webDriver.findElement(By.cssSelector("#kw"));
  15.         //输入 mrjade
  16.         input.sendKeys("mrjade");
  17.         //点击搜索按钮
  18.         webDriver.findElement(By.cssSelector("#su")).click();
  19.         //获取词条
  20.         List<WebElement> aEms = webDriver.findElements(By.cssSelector("a em"));
  21.         //查看词条数量
  22.         System.out.println(aEms.size());
  23.     }
  24. }

图片

这里的结果是0,因为程序还没等浏览器页面加载完 就执行完了,下面就是解决办法。

1.使用 sleep()

  1. // 等待 1 秒
  2. Thread.sleep(1000);

这时就把当前页面的词条全获取了。但是用sleep有一个缺点,就是无法把握时间点。如果时间短了则元素获取不完整,如果长了就需要阻塞很长时间,效率低下。好在webDriver提供了API来解决这些问题。

2.隐式等待

Web驱动程序在每次查找元素时都等待一定的时间,直到找到元素或者超时为止。隐式等待只需要设置一次,就会对整个会话生效。隐式等待的优点是简单易用,缺点是不能针对特定的元素或条件进行灵活的调整。隐式等待可以通过如下代码实现。

  1. WebDriver webDriver = new ChromeDriver();
  2. // 设置全局隐式等待,最长等待时间为 5 秒
  3. webDriver.manage().timeouts().implicitlyWait(5, TimeUnit.SECONDS);

3.显示等待

显示等待可以对一个元素进行等待,比隐式等待更灵活。

  1. WebDriver webDriver = new ChromeDriver();
  2. # 在设置时间(5s)内,等待后面的条件发生。如果超过设置时间未发生,则抛出异常。在等待期间,每隔一定时间(默认1秒),调用untiluntil_not里的方法,直到它返回TrueFalse.
  3. WebDriverWait wait = new WebDriverWait(webDriver, 51);
  4. WebElement elem = wait.until(ExpectedConditions.presenceOfElementLocated(By.id("元素id")));
  • 5:最长超时时间(默认以秒为单位)

  • 1:检测的的间隔时间

ExpectedConditions含了一系列的预定义条件,用于等待页面上的元素出现或者满足特定的条件。resenceOfElementLocated方法会等待页面上的一个元素出现,直到它被找到或者超时。

如果元素被找到,该方法会返回一个WebElement对象,然后这个对象会被赋值给elem变量。这个WebElement对象可以用来执行其他的操作,比如点击、输入文本等等。如果元素没有被找到,该方法会抛出一个TimeoutException异常。

ExpectedConditions的其它方法(部分如图)

图片

  1. /**
  2.  * @author 公众号:伤心的辣条
  3.  * @version 创建时间:2023/10
  4.  * 类说明:自动化测试脚本 Selenium WebDriver(Java)常用 API 汇总
  5.  */
  6. public class SeleniumTest {
  7.     public static void main(String[] args){
  8.         ChromeOptions options = new ChromeOptions();
  9.         //允许任何来源的远程连接,这样可以避免一些跨域问题。
  10.         options.addArguments("--remote-allow-origins=*");
  11.         WebDriver webDriver = new ChromeDriver(options);
  12.         webDriver.get("https://baidu.com");
  13.         // 初始化显式等待条件
  14.         WebDriverWait wait = new WebDriverWait(webDriver, 51);
  15.         //css 选择器,选择搜索框
  16.         WebElement input = webDriver.findElement(By.cssSelector("#kw"));
  17.         //输入软件测试
  18.         input.sendKeys("软件测试");
  19.         //点击搜索按钮
  20.         webDriver.findElement(By.cssSelector("#su")).click();
  21.         //校验
  22.         //1.找到搜索结果
  23.         List<WebElement> aEms = wait.until(ExpectedConditions.presenceOfAllElementsLocatedBy(By.cssSelector("a em")));
  24.         System.out.println(aEms.size());
  25.     }
  26. }

七.浏览器操作

1.浏览器启动的窗口大小

  1. webdriver.manage().window().maximize();窗口最大化
  2. webdriver.manage().window().setSize(new Dimension(480800));设置窗口宽高

2.浏览器前进后退刷新

  1. webdriver.navigate().back(); //后退
  2. webdriver.navigate().forward(); //前进
  3. webdriver.navigate().refresh(); //刷新

3.关闭浏览器

  1. webdriver.quit() //关闭整个浏览器
  2. webdriver.close() //关闭当前页面

七.使用 JS 代码

  1. JavascriptExecutor js = (JavascriptExecutor) webDriver;
  2. js.executeScript("js代码");
  1. /**
  2.  * @author 公众号:伤心的辣条
  3.  * @version 创建时间:2023/10
  4.  * 类说明:自动化测试脚本 Selenium WebDriver(Java)常用 API 汇总
  5.  */
  6. public class SeleniumTest {
  7.     public static void main(String[] args){
  8.         ChromeOptions options = new ChromeOptions();
  9.         options.addArguments("--remote-allow-origins=*");
  10.         WebDriver webDriver = new ChromeDriver(options);
  11.         //窗口最大化
  12.         webDriver.manage().window().maximize();
  13.         //隐式等待
  14.         webDriver.manage().timeouts().implicitlyWait(1, TimeUnit.SECONDS);
  15.         //打开百度
  16.         webDriver.get("https://baidu.com");
  17.         //执行 js 代码
  18.         JavascriptExecutor js = (JavascriptExecutor) webDriver;
  19.         js.executeScript("alert('你好')");
  20.     }
  21. }

图片

  1. # 滚动条
  2. JavascriptExecutor js = (JavascriptExecutor) webDriver;
  3. js.executeScript("document.documentElement.scrollTop= x ");//x 表示文档顶部距离视口顶部的距离
  4. //方式2
  5. //x 参数表示水平的左间距;
  6. //y 参数表示垂直的上边距。
  7. js.executeScript("window.scrollTo(x,y);");
  8. JavascriptExecutor js = (JavascriptExecutor) webDriver;
  9. js.executeScript("document.documentElement.scrollTop= x ");//x 表示文档顶部距离视口顶部的距离
  10. //方式2
  11. //x 参数表示水平的左间距;
  12. //y 参数表示垂直的上边距。
  13. js.executeScript("window.scrollTo(x,y);");

八.模拟键盘操作

sendKeys()方法也可以模拟键盘操作,例如 sendKeys(Keys.CONTROL, 'a') 表示按下 Ctrl+A 组合键。

图片

九.模拟鼠标操作

Actions类可以帮助我们实现鼠标操作,Actions类的方法是用来创建一系列的操作,但是不会立即执行,而是存放在一个队列中。当调用perform()方法时,队列中的操作才会按顺序执行。

图片

  1. // 百度首页“设置”悬停下拉菜单
  2. WebDriver driver = new ChromeDriver();
  3. driver.get("https://www.baidu.com/");
  4. WebElement search_setting = driver.findElement(By.id("s-usersetting-top"));
  5. Actions action = new Actions(driver);
  6. action.moveToElement(search_setting).perform();
  7. // 鼠标拖拽动作,将 source 元素拖放到 target 元素的位置
  8. WebElement source = driver.findElement(By.name("element"));
  9. WebElement target = driver.findElement(By.name("element"));
  10. action.dragAndDrop(source,target).perform();

十.多层框架定位

frame 是一个 HTML 元素,它定义了一个特定区域,另一个 HTML 文档可以在里面展示。比如

  1. <!--
  2. @author 公众号:伤心的辣条
  3. @version 创建时间:2023/10
  4. 类说明:自动化测试脚本 Selenium WebDriver(Java)常用 API 汇总
  5. -->
  6. <html>
  7.     <frameset cols="25%,50%,25%">
  8.       <frame src="frame_a.htm" />
  9.       <frame src="frame_b.htm" />
  10.       <frame src="frame_c.htm" />
  11.     </frameset>
  12. </html>

一个页面里面嵌了三个页面,但是selenium定位的时候默认只能定位到最外面一层的页面,如果想要切换页面(访问下层页面)可以使用如下API

  • Frame标签包含 frameset、frame、iframe 三种。

  • Frameset 和普通的标签一样,不会影响正常的定位,可以使用 index、id、name 等任意种方式定位。

  • 而 frame 与 iframe 对 selenium 定位而言是一样的。selenium 有一组方法对 frame 进行操作。

  1. // 切换到 id 为 x 的fram下
  2. webdriver.switchTo().frame(x);
  3. // 后面可以定位到该 frame 中的元素
  4. webdriver.findElement(By.id("id"));
  5. // ……

  1. // 如果frame没有标签,可以使用索引来定位
  2. // 索引从 1 开始。webdriver.switchTo().frame(1)表示切换到该页面下的第一个frame。
  3. webdriver.switchTo().frame(index);

十一.下拉框处理

  1. <!--
  2. @author 公众号:伤心的辣条
  3. @version 创建时间:2023/10
  4. 类说明:自动化测试脚本 Selenium WebDriver(Java)常用 API 汇总
  5. -->
  6. <html>
  7. <body>
  8.     <select id="ShippingMethod" onchange="updateShipping(options[selectedIndex]);" name="ShippingMethod">
  9.         <option value="12.51">UPS Next Day Air ==> $12.51</option>
  10.         <option value="11.61">UPS Next Day Air Saver ==> $11.61</option>
  11.         <option value="10.69">UPS 3 Day Select ==> $10.69</option>
  12.         <option value="9.03">UPS 2nd Day Air ==> $9.03</option>
  13.         <option value="8.34">UPS Ground ==> $8.34</option>
  14.         <option value="9.25">USPS Priority Mail Insured ==> $9.25</option>
  15.         <option value="7.45">USPS Priority Mail ==> $7.45</option>
  16.         <option value="3.20" selected="">USPS First Class ==> $3.20</option>
  17.     </select>
  18. </body>
  19. </html>

  1. // 定位 <select> 标签下拉框
  2. WebElement selectElem = webDriver.findElement(By.cssSelector("#ShippingMethod"));
  3. // Select 类用于定位 select 标签
  4. Select select = new Select(selectElem);
  5. // 方式1:通过下标选择:从 1 开始计数
  6. select.selectByIndex(1);
  7. // 方式2:通过 value 属性的值选择
  8. select.selectByValue("11.61");

十二.弹窗处理

在 WebDriver 中处理 alertconfirm 以及 prompt 时,先用switchTo() 方法定位到弹窗,然后使用一些方法进行操作。

  1. // 假设点击后弹出弹窗
  2. webDriver.findElement(By.cssSelector("button")).click();
  3. // 切换到弹窗上
  4. Alert alert = webDriver.switchTo().alert();
  5. // 弹窗取消
  6. alert.dismiss();
  7. // 弹窗接受
  8. alert.accept();
  9. // 输入数据
  10. alert.sendKeys("数据");
  11. // 获取弹窗里的文字
  12. alert.getText();

十三.上传文件

上传文件也是用 sendKeys() 方法。

  1. <!--
  2. @author 公众号:伤心的辣条
  3. @version 创建时间:2023/10
  4. 类说明:自动化测试脚本 Selenium WebDriver(Java)常用 API 汇总
  5. -->
  6. <html>
  7. <head>
  8.     <meta http-equiv="content-type" content="text/html;charset=utf-8" />
  9.     <title>upload_file</title>
  10. </head>
  11. <body>
  12.     <div class="row-fluid">
  13.         <div class="span6 well">
  14.             <h3>upload_file</h3>
  15.             <input type="file" name="file" />
  16.         </div>
  17.     </div>
  18. </body>
  19. </html>

  1. //定位上传按钮,然后上传文件
  2. webDriver.findElement(By.cssSelector("input")).sendKeys("D:\\text.txt");

十四.浏览器窗口切换

如果想要操作其它页面,需要先跳到其它页面

  1. webDriver.getWindowHandle():获得当前浏览器窗口的句柄。
  2. webDriver.getWindowHandles():返回所有浏览器窗口的句柄。
  3. webDriver.switchTo().window(handle):用于切换到相应的浏览器窗口。
  1. /**
  2.  * @author 公众号:伤心的辣条
  3.  * @version 创建时间:2023/10
  4.  * 类说明:自动化测试脚本 Selenium WebDriver(Java)常用 API 汇总
  5.  */
  6. public class SeleniumTest {
  7.     private static void main(String[] args) throws InterruptedException {
  8.         WebDriver webDriver = new ChromeDriver();
  9.         webDriver.get("https://www.baidu.com");
  10.         //等待时间
  11.         webDriver.manage().timeouts().implicitlyWait(5, TimeUnit.SECONDS);
  12.         //放大窗口,让登录按钮显示出来
  13.         webDriver.manage().window().maximize();
  14.         //获取登录按钮,并点击
  15.         webDriver.findElement(By.cssSelector("#s-top-loginbtn")).click();
  16.         //点击“立即注册”,打开注册页面
  17.         webDriver.findElement(By.cssSelector("#TANGRAM__PSP_11__regLink")).click();
  18.         //获取当前页面的句柄,此时是首页
  19.         String handle = webDriver.getWindowHandle();
  20.         //获取所有的页面的句柄(这时一共两个句柄)
  21.         Set<String> handles = webDriver.getWindowHandles();
  22.         //for 循环遍历句柄
  23.         for (String tmp : handles) {
  24.             //比较是不是注册页面
  25.             if (!handle.equals(tmp)) {
  26.                 //切换到注册页面
  27.                 webDriver.switchTo().window(tmp);
  28.                 //输入用户名
  29.                 webDriver.findElement(By.cssSelector("#TANGRAM__PSP_4__userName")).sendKeys("会飞的喵喵123123123");
  30.                 //输入手机号
  31.                 webDriver.findElement(By.cssSelector("#TANGRAM__PSP_4__phone")).sendKeys("13220333333");
  32.                 //输入密码
  33.                 webDriver.findElement(By.cssSelector("#TANGRAM__PSP_4__password")).sendKeys("123456");
  34.                 //睡眠3
  35.                 Thread.sleep(3000);
  36.                 //关闭当前页面
  37.                 webDriver.close();
  38.             }
  39.         }
  40.     }
  41. }

十五.获取窗口截图

添加依赖:添加这个依赖是为了使用FileUtils类,它能方便操作文件

  1. <!-- https://mvnrepository.com/artifact/commons-io/commons-io -->
  2. <dependency>
  3.     <groupId>commons-io</groupId>
  4.     <artifactId>commons-io</artifactId>
  5.     <version>2.14.0</version>
  6. </dependency>

  1. // 截图
  2. File srcFile = ((TakesScreenshot)webDriver).getScreenshotAs(OutputType.FILE);
  3. // 将截图保存到 D 盘
  4. FileUtils.copyFile(srcFile,new File("D:\\test.png"));

  1. /**
  2.  * @author 公众号:伤心的辣条
  3.  * @version 创建时间:2023/10
  4.  * 类说明:自动化测试脚本 Selenium WebDriver(Java)常用 API 汇总
  5.  */
  6. public class SeleniumTest {
  7.     private static void main(String[] args) throws IOException, InterruptedException {
  8.         WebDriver webDriver = new ChromeDriver();
  9.         webDriver.get("https://www.baidu.com");
  10.         //等待时间
  11.         webDriver.manage().timeouts().implicitlyWait(5,TimeUnit.SECONDS);
  12.         //放大窗口,让登录按钮显示出来
  13.         webDriver.manage().window().maximize();
  14.         //获取登录按钮,并点击
  15.         webDriver.findElement(By.cssSelector("#s-top-loginbtn")).click();
  16.         Thread.sleep(1000);
  17.         //截图
  18.         File srcFile = ((TakesScreenshot)webDriver).getScreenshotAs(OutputType.FILE);
  19.         //将截图保存到 D 盘
  20.         FileUtils.copyFile(srcFile,new File("D:\\test.png"));
  21.     }
  22. }

行动吧,在路上总比一直观望的要好,未来的你肯定会感谢现在拼搏的自己!如果想学习提升找不到资料,没人答疑解惑时,请及时加入群: 786229024,里面有各种测试开发资料和技术可以一起交流哦。

最后:下方这份完整的软件测试视频教程已经整理上传完成,需要的朋友们可以自行领取【保证100%免费】

软件测试面试文档

我们学习必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有字节大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/2023面试高手/article/detail/456087
推荐阅读
相关标签
  

闽ICP备14008679号