自动化测试请在允许授权的测试环境下进行,不可有任何危害网络安全的操作,如有违规操作,与本文无关 。本文有不少内容,参考了CSDN的博主[Penny 要努力呀],大家也可以直接去访问,写的很详细,很赞 。
自动化开发环境搭建环境准备JDK安装并配置完成已经安装好浏览器,这里我们使用谷歌浏览器IDEA已经安装,直接官网下就可以 , 社区版免费浏览器驱动下载
使用selenium需要下载一个WebDriver,要注意WebDriver的版本要与浏览器的版本类型一致,否则可能会出异常,我们使用的浏览器版本如下:
所以我们这里要去下载谷歌浏览器对应版本的WebDriver,地址如下:
https://www.selenium.dev/documentation/webdriver/getting_started/install_drivers/
选择和自己浏览器相符合的版本即可 , 这里我们选择mac这个版本 , 如果是其他系统就选择对应的版本:
如果你的操作系统是mac的话 , 需要在终端,将目录切换至driver所在的目录,执行如下命令:
xattr -d com.apple.quarantine chromedriver
否则会报如下的错误:MacOS无法打开“chromedriver”,因为无法验证开发者
IDEA 创建Maven项目
这里我们选择使用java语言来进行开发,selenium框架也有对应的python版本 , 在jar管理上,我们使用maven来管理,简单且方便 。
我们使用IDEA创建一个maven项目吗,菜单路径:File->New->Project:
输入项目名和项目路径,点击Finish即可:
完成后截图如下:
我们打开pom.xml文件导入selenium和testNG的依赖包,完整的pom文件信息如下,主要关注依赖的坐标就可以了,添加完依赖包的坐标后,记得刷新一下,把包引进来,没有的 , 需要等待它下载完成,否则会报红:
4.0.0org.exampleSeleniumStudy1.0-SNAPSHOTorg.seleniumhq.seleniumselenium-java4.1.2org.testngtestng7.5
这里我们引入了两个依赖包,selenium包和testNG测试框架,引入testNG是方便我们测试 。
selenium初探
我们先感受一下selenium的使用,这里我们使用的网站是我们自己开发在本地的项目,我们以最经典的登录为例,登录界面如下:
示例代码如下:
import org.openqa.selenium.By;import org.openqa.selenium.WebDriver;import org.openqa.selenium.chrome.ChromeDriver;import org.testng.annotations.Test;public class SeleniumTest {@Testpublic void login(){// 设置驱动System.setProperty("webdriver.chrome.driver", "/Users/yangchen/MyProject/SeleniumStudy/driver/chromedriver");// 创建一个WebDriver对象WebDriver driver = new ChromeDriver();// 打开Web页面driver.get("http://localhost:8080/#/");// 通过ID定位到账户输入框driver.findElement(By.id("account")).sendKeys("123456@qq.com");driver.findElement(By.id("password")).sendKeys("123456");driver.findElement(By.id("login_btn")).click();try {Thread.sleep(5000);} catch (InterruptedException e) {e.printStackTrace();}driver.close();}}
执行结果如下:
我们在上面实现了一个简单的登录功能,在这个程序中我们可以了解到:
@Test是一个TestNG测试框架中的注解,当方法被该注解标识 , 就可以单独运行,这样就不用写主方法了,后面我们单独开一期,系统的学习一下TestNG的框架Web UI自动化的创建思路,一般都是创建一个WebDriver对象,就相当于你拥有了一个浏览器,然后通过get()方法进入你要进行测试的网页 , 然后再通过元素定位去操作每个元素,这也就是我们通常说的找对象,当操作完成后,最后我们关闭浏览器,释放资源 。基本上所有的UI自动化测试,很大的一部分工作内容就是在元素的定位 。Selenium元素定位By.id定位
该方法即使通过Web元素的id属性来定义,一般情况下如果元素有id,我们就使用id定义 , 因为id一般都是不重复的,定位准确,我们上面的示例中的元素定义就采用的id定位 。
前端页面代码
java定位代码
driver.findElement(By.id("password"));
By.name定位
该方法与By.id方法类似,只不是通过name属性来定位的,有的时候,前端元素 , 它没有id,但是它有name,这个时候我们就可以使用name来定位 。
前端页面代码
java定位代码
driver.findElement(By.name("email"))
By.className定位
有的时候,他们既没有id也没有name,但是它有className,这个class不是编程中的类,它和id一样,也是前端元素的一种属性,与id不一样的是,id是唯一的,但是className是不唯一的 。前端页面代码
java定位代码
// 定位邮箱输入框driver.findElement(By.className("el-input__inner")).sendKeys("123456@qq.com");driver.findElement(By.id("password")).sendKeys("123456");driver.findElement(By.id("login_btn")).click();
在我们的页面,有两个元素,邮箱输入框和密码输入框,他们的className都是一样的,但是为什么还是能准确定位到邮箱输入框,这是因为我们在找元素的时候,使用的是findElement方法,使用find_element()查找元素,但有多个元素满足条件时,他只取所有满足条件的元素列表的第1个元素,因为邮箱在第一个位置,所以就不会报错 , 但是如果用这个方法定位密码的输入框就会有问题 。
此时就需要使用到find_element()方法了,该方法会返回一个List,也就是一个数组集合,此时我们可以通过使用List中get(int index)方法 , 来取到第二个元素完成元素定位 , 关键代码如下:
driver.findElement(By.className("el-input__inner")).sendKeys("123456@qq.com");driver.findElements(By.className("el-input__inner")).get(1).sendKeys("123456");
By.tagName定位
该方法就是通过元素的标签定位,在html页面中有很多标签元素,如:input、div、span、button等等,因此我们也可以使用标签来定位,关键代码如下: 前端页面代码
java定位代码
driver.findElement(By.tagName("input")).sendKeys("123456@qq.com");driver.findElements(By.tagName("input")).get(1).sendKeys("123456");
By.linkText定位
该方法就是专门用来定位超链接文本的 , 比如我们平台的数据解读说明超链接文本 , 页面如下:
,前端代码如下:
数据解读说明
这里的登录按钮,我们就可以使用linkText定位到,关键代码如下:
driver.findElement(By.linkText("数据解读说明")).click();
By.partialLinkText定位
我们上面定位链接文字的时候,是精确匹配的,我们也可以使用模糊匹配,上面的数据解读说明,我们只需输入数据解读,也可以正常匹配到,关键代码如下:
driver.findElement(By.partialLinkText("数据解读")).click();
By.xpath定位
该定位方法也是用的比价多的,xpath全称为XML Path的简称 , 他可以通过xpath的语法,定位到页面的每个元素,具体的语法我们就不铺开了,我们讲下使用,现在的浏览器开发者工具很方便,我们可以获取到xpath路径,如下图:
相对路径写法//*[@id="password"]绝对路径写法/html/body/div/div/div/div[2]/form/div[2]/div/div/input
我们推荐使用相对路径写法
java核心代码如下
driver.findElement(By.xpath("//*[@id="password"]")).sendKeys("123456");
By.cssSelector定位
在说css样式选择器之前,我们这里先简单的说一下css,如果我们把元素的前端标签当成毛坯房的话,那么css就相当于给毛坯房装修的,我们这里以输入框做个简单的示例,前端代码如下:
测试
#input{border:1px solid #cac6c6;padding: 5px;min-width: 200px;border-radius: 3px;}
前端页面效果如下:
使用了css样式,渲染出来的页面要更好看一些,在css中一般有如下几种方式定位:
# :通过id. : 通过标签的类名通过标签名定位标签+属性:即 标签名[属性名=属性值]层级定位:父标签[父标签属性名=父标签属性值]>(或者空格)子标签索引定位:父标签[父标签属性名=父标签属性值]>子标签:nth-child(索引序号)逻辑定位:标签名[标签名1= 属性值1][标签名2=属性值2]
核心代码
// 通过id定位driver.findElement(By.cssSelector("#account")).sendKeys("123456@qq.com");// 通过标签类名定位driver.findElement(By.cssSelector(".el-input__inner")).sendKeys("123456@qq.com");// 通过`标签+属性`定位driver.findElement(By.cssSelector("input[placeholder='请输入邮箱']")).sendKeys("123456@qq.com");// 通过层级来定位driver.findElement(By.cssSelector("div[class='el-input']>input")).sendKeys("123456@qq.com");// 通过索引来定位,索引从1开始driver.findElement(By.cssSelector("div[class='el-input']>input:nth-child(2)")).sendKeys("123456@qq.com");// 逻辑定位driver.findElement(By.cssSelector("input[placeholder='请输入邮箱'][autocomplete='off']")).sendKeys("123456@qq.com");
特殊场景元素定位
我们上面说的定位方式,都是正常的场景,但是有一些场景比价特殊,比如在一个页面中嵌入了一个iframe页面、弹出一个新的选择页面、打开一个新的页面等等 , 这个时候我们直接使用上面的八大定位可能就不好使了 , 所以就需要一些特殊的方法 。
iframe 表单页面定位
我们有时候会遇到像如下图中这种页面
在一个页面中又嵌套了一个页面即内联框架,但是这个时候我们想登录,直接去定位登录的元素,是行不通,我们需要通过switchTo().frame()方法 , 切换到iframe中,如果我们想再切换回默认页面,可以使用switchTo().defaultContent();方法切换回来 。
前端代码如下:
测试这里是iframe外#input{border:1px solid #cac6c6;padding: 5px;min-width: 200px;border-radius: 3px;}
示例代码如下:
import org.openqa.selenium.By;import org.openqa.selenium.Dimension;import org.openqa.selenium.WebDriver;import org.openqa.selenium.WebElement;import org.openqa.selenium.chrome.ChromeDriver;import org.openqa.selenium.interactions.Actions;import org.testng.annotations.Test;public class SeleniumTest {@Testpublic void login() throws InterruptedException {// 设置驱动System.setProperty("webdriver.chrome.driver", "/Users/yangchen/MyProject/SeleniumStudy/driver/chromedriver");// 创建一个WebDriver对象WebDriver driver = new ChromeDriver();// 打开Web页面driver.get("http://localhost:63343/invest-project-ui/public/Test.html?_ijt=g0len3inipqu9bfu2vej06nd81&_ij_reload=RELOAD_ON_SAVE");driver.get("http://localhost:63343/invest-project-ui/public/Test.html?_ijt=s0qnsv131v37q4o773bh8tk7rn");// 先定位到iframeWebElement iframe=driver.findElement(By.id("login_iframe"));// 再切换至iframe中Thread.sleep(1000);driver.switchTo().frame(iframe);// 通过ID定位到账户输入框Thread.sleep(1000);WebElement account=driver.findElement(By.id("account"));Thread.sleep(1000);account.sendKeys("123456@qq.com");Thread.sleep(1000);driver.findElement(By.id("password")).sendKeys("123456");// 点击按钮driver.findElement(By.id("login_btn")).click();// 再切换回默认页面driver.switchTo().defaultContent();Thread.sleep(1000);driver.close();}}
多窗口切换
我们有一个页面,我们点击了一下一个按钮或者超链接 , 它打开了一个新的页面,我们需要到新的页面操作,此时我们需要先获取的局面的句柄,然后再通过switchTo().window()方法切换至新打开的页面进行操作,前端代码如下:
测试自动化测试登录页面#input{border:1px solid #cac6c6;padding: 5px;min-width: 200px;border-radius: 3px;}
JAVA代码
import org.openqa.selenium.By;import org.openqa.selenium.Dimension;import org.openqa.selenium.WebDriver;import org.openqa.selenium.WebElement;import org.openqa.selenium.chrome.ChromeDriver;import org.openqa.selenium.interactions.Actions;import org.testng.annotations.Test;import java.util.Set;public class SeleniumTest {@Testpublic void login() throws InterruptedException {// 设置驱动System.setProperty("webdriver.chrome.driver", "/Users/yangchen/MyProject/SeleniumStudy/driver/chromedriver");// 创建一个WebDriver对象WebDriver driver = new ChromeDriver();// 打开Web页面driver.get("http://localhost:63343/invest-project-ui/public/Test.html?_ijt=s0qnsv131v37q4o773bh8tk7rn");WebElement login=driver.findElement(By.id("login"));Thread.sleep(1000);login.click();// 获取当前窗口句柄String search_handle = driver.getWindowHandle();//获得所有窗口句柄Set handles = driver.getWindowHandles();for(String handle : handles){if(handle.equals(search_handle)==false){//切换到登录页面driver.switchTo().window(handle);// 通过ID定位到账户输入框Thread.sleep(1000);WebElement account=driver.findElement(By.id("account"));Thread.sleep(1000);account.sendKeys("123456@qq.com");Thread.sleep(1000);driver.findElement(By.id("password")).sendKeys("123456");// 点击按钮driver.findElement(By.id("login_btn")).click();}}Thread.sleep(1000);// 切换至之前的页面driver.switchTo().window(search_handle);Thread.sleep(1000);driver.quit();}}
执行效果如下:
警告框处理
在前端页面中我们会遇到如下这种弹框:
这是就需要,通过switch_to_alert()方法定位到弹框中 , 然后再执行操作 , 弹框常用的方法如下:
getText(): 返回弹框中的文字信息 。accept(): 接受现有警告框 。dismiss(): 解散现有警告框 。sendKeys(keysToSend): 发送文本至警告框 。keysToSend: 将文本发送至警告框 。
示例的前端代码:
测试function disp_alert(){confirm("自动化测试!","")}自动化测试
JAVA代码
import org.openqa.selenium.*;import org.openqa.selenium.chrome.ChromeDriver;import org.openqa.selenium.interactions.Actions;import org.testng.annotations.Test;import java.util.Set;public class SeleniumTest {@Testpublic void login() throws InterruptedException {// 设置驱动System.setProperty("webdriver.chrome.driver", "/Users/yangchen/MyProject/SeleniumStudy/driver/chromedriver");// 创建一个WebDriver对象WebDriver driver = new ChromeDriver();// 打开Web页面driver.get("http://localhost:63343/invest-project-ui/public/Test.html?_ijt=s0qnsv131v37q4o773bh8tk7rn");WebElement alert=driver.findElement(By.id("alert"));Thread.sleep(1000);alert.click();// 跳转alertAlert alertFrame = driver.switchTo().alert();// 向弹框输入框中输入文本Thread.sleep(2000);alertFrame.sendKeys("自动化测试");Thread.sleep(2000);System.out.println("弹框中的文字信息:"+alertFrame.getText());// 确认弹框alertFrame.accept();Thread.sleep(2000);driver.quit();}}
选择框处理
选择框主要支持如下几种方式定位:
selectByVisibleText(): 通过文本选择选项selectByIndex(): 通过索引选择选项selectByValue(): 通过值选择选项
测试自动化测试城市上海苏州南京杭州
JAVA代码如下:
import org.openqa.selenium.*;import org.openqa.selenium.chrome.ChromeDriver;import org.openqa.selenium.interactions.Actions;import org.openqa.selenium.support.ui.Select;import org.testng.annotations.Test;import java.util.Set;public class SeleniumTest {@Testpublic void login() throws InterruptedException {// 设置驱动System.setProperty("webdriver.chrome.driver", "/Users/yangchen/MyProject/SeleniumStudy/driver/chromedriver");// 创建一个WebDriver对象WebDriver driver = new ChromeDriver();// 打开Web页面driver.get("http://localhost:63343/invest-project-ui/public/Test.html?_ijt=s0qnsv131v37q4o773bh8tk7rn");WebElement select_el=driver.findElement(By.id("city"));Select sel = new Select(select_el);Thread.sleep(1000);sel.selectByVisibleText("上海");Thread.sleep(2000);sel.selectByIndex(1);Thread.sleep(2000);sel.selectByValue("nanjing");Thread.sleep(2000);driver.quit();}}
执行结果如下:
上传文件
import org.openqa.selenium.*;import org.openqa.selenium.chrome.ChromeDriver;import org.testng.annotations.Test;public class SeleniumTest {@Testpublic void login() throws InterruptedException {// 设置驱动System.setProperty("webdriver.chrome.driver", "/Users/yangchen/MyProject/SeleniumStudy/driver/chromedriver");// 创建一个WebDriver对象WebDriver driver = new ChromeDriver();// 打开Web页面driver.get("http://localhost:63343/invest-project-ui/public/Test.html?_ijt=s0qnsv131v37q4o773bh8tk7rn");WebElement upload_file=driver.findElement(By.id("upload_file"));Thread.sleep(2000);upload_file.sendKeys("/Users/yangchen/Pictures/123.png");Thread.sleep(2000);driver.quit();}}
执行结果如下:
元素等待
在做UI自动化的过程中,会因为种种原因,比如网络、页面加载快慢,导致元素并不能及时的获取到,这个时候,就需要我们使用元素等待 , 等待找到指定的元素网站本地测试,再进行下一步,一般等待分为三种:
强制等待:强制等待,就是假如我在找某个元素之前,强制等待10s,但是,不管元素有没有加载好 , 都要等待10s才能继续 , 这样看起来不太智能,如果2s就加载好了,再继续等就会浪费时间 , 效率不高 。显式等待:显示等待要比强制等待,要智能的多,它可以针对于某个特定的元素设置的等待时间,它有两个参数:检测时间、最大等待时间,如果我们把检测时间设置为1s , 最大等待时间设置为10s,也就意味着,每0.5s就会查找一下元素,只要一找到就立刻继续 , 不会继续等待,如果一直没找到,超过了最大的等待的时间,就会报错 。隐式等待[1]:隐式等待和显示等待类似,但是不同的时候,隐式等待针对的是页面所有元素网站本地测试,是全局 , 而显示等待是针对某个元素 。
java示例代码
import org.openqa.selenium.By;import org.openqa.selenium.WebDriver;import org.openqa.selenium.WebElement;import org.openqa.selenium.chrome.ChromeDriver;import org.openqa.selenium.support.ui.ExpectedCondition;import org.openqa.selenium.support.ui.ExpectedConditions;import org.openqa.selenium.support.ui.WebDriverWait;import org.testng.annotations.Test;import java.util.concurrent.TimeUnit;public class SeleniumTest {@Testpublic void login(){// 设置驱动System.setProperty("webdriver.chrome.driver", "/Users/yangchen/MyProject/SeleniumStudy/driver/chromedriver");// 创建一个WebDriver对象WebDriver driver = new ChromeDriver();/*** 隐式等待,全局等待* 1. implicitlyWait 识别对象时的超时时间* 2. setScriptTimeout 异步脚本的超时时间* 3. pageLoadTimeout 页面加载时的超时时间* *///页面加载超时时间设置为 5sdriver.manage().timeouts().pageLoadTimeout(5, TimeUnit.SECONDS);//定位对象时给 5 的时间, 如果 10s 内还定位不到则抛出异常driver.manage().timeouts().implicitlyWait(5, TimeUnit.SECONDS);//异步脚本的超时时间设置成 5sdriver.manage().timeouts().setScriptTimeout(5, TimeUnit.SECONDS);// 打开Web页面driver.get("http://localhost:8080/#/");// 通过ID定位到账户输入框try {//强制等待1sThread.sleep(1000);driver.findElement(By.cssSelector("input[placeholder='请输入邮箱']")).sendKeys("123456@qq.com");//隐式等待//显式等待方式一,针对某个元素等待WebDriverWait wait = new WebDriverWait(driver,10, 1);wait.until(ExpectedConditions.visibilityOfElementLocated(By.xpath("//*[@id="password"]"))).sendKeys("123456");//显式等待方式二wait.until(new ExpectedCondition(){@Overridepublic WebElement apply(WebDriver text) {return driver.findElement(By.xpath("//*[@id="password"]"));}}).sendKeys("123456");driver.findElement(By.id("login_btn")).click();} catch (InterruptedException e) {e.printStackTrace();}finally {driver.close();}}}
浏览器常用APImaximize():浏览器窗口最大化minimize():浏览器窗口最小化fullscreen():浏览器全屏setSize():设置浏览器宽高back():模拟浏览器后退按钮forward():模拟浏览器前进按钮refresh():刷新流量器driver.close():关闭当前页面driver.quit():退出浏览器
示例代码如下:
import org.openqa.selenium.By;import org.openqa.selenium.Dimension;import org.openqa.selenium.WebDriver;import org.openqa.selenium.chrome.ChromeDriver;import org.testng.annotations.Test;public class SeleniumTest {@Testpublic void login() throws InterruptedException {// 设置驱动System.setProperty("webdriver.chrome.driver", "/Users/yangchen/MyProject/SeleniumStudy/driver/chromedriver");// 创建一个WebDriver对象WebDriver driver = new ChromeDriver();// 打开Web页面driver.get("http://localhost:8080/#/");Thread.sleep(2000);// 窗口最小化driver.manage().window().minimize();Thread.sleep(2000);// 窗口最大化driver.manage().window().maximize();// 设置窗口指定大小Thread.sleep(2000);driver.manage().window().setSize(new Dimension(1000,600));Thread.sleep(2000);// 窗口全屏driver.manage().window().fullscreen();// 通过ID定位到账户输入框Thread.sleep(2000);driver.findElement(By.id("account")).sendKeys("123456@qq.com");Thread.sleep(2000);driver.findElement(By.id("password")).sendKeys("123456");driver.findElement(By.id("login_btn")).click();Thread.sleep(2000);// 刷新页面driver.navigate().refresh();// 浏览器后退driver.navigate().back();// 浏览器前进driver.navigate().forward();Thread.sleep(3000);driver.close();}}
执行结果如下:
常用事件
我们在使用浏览器的时候,一般都会做一些操作,比如输入、点击、这些我们已经在登录的示例中,操作过了,除此之外,还有一些其他的事件方法,下面我们看一下常用的事件方法:
sendKeys(*value):该方法为输入方法 , 主要作用是模拟按键操作,比如输入文本、操作键盘上的某个按键、上传指定的文件 。click():该方法为点击事件,可以点击按钮、超链接、图片、选择框等元素 。clear():用于清空文本输入框中的内容submit():主要用于表单的提交 示例代码如下:
import org.openqa.selenium.By;import org.openqa.selenium.Dimension;import org.openqa.selenium.WebDriver;import org.openqa.selenium.WebElement;import org.openqa.selenium.chrome.ChromeDriver;import org.testng.annotations.Test;public class SeleniumTest {@Testpublic void login() throws InterruptedException {// 设置驱动System.setProperty("webdriver.chrome.driver", "/Users/yangchen/MyProject/SeleniumStudy/driver/chromedriver");// 创建一个WebDriver对象WebDriver driver = new ChromeDriver();// 打开Web页面driver.get("http://localhost:8080/#/");// 通过ID定位到账户输入框Thread.sleep(1000);WebElement account=driver.findElement(By.id("account"));Thread.sleep(1000);account.sendKeys("123456sdfdsfsf@qq.com");Thread.sleep(1000);// 清空文本框account.clear();account.sendKeys("123456@qq.com");Thread.sleep(1000);driver.findElement(By.id("password")).sendKeys("123456");// 点击按钮driver.findElement(By.id("login_btn")).click();Thread.sleep(1000);driver.close();}}
获取页面元素信息常用方法getSize(): 返回元素的尺寸 。getText(): 获取元素的文本 。getAttribute(name): 获得属性值 。isDisplayed(): 返回该元素是否用户可见 。
import org.openqa.selenium.By;import org.openqa.selenium.Dimension;import org.openqa.selenium.WebDriver;import org.openqa.selenium.WebElement;import org.openqa.selenium.chrome.ChromeDriver;import org.openqa.selenium.interactions.Actions;import org.testng.annotations.Test;public class SeleniumTest {@Testpublic void login() throws InterruptedException {// 设置驱动System.setProperty("webdriver.chrome.driver", "/Users/yangchen/MyProject/SeleniumStudy/driver/chromedriver");// 创建一个WebDriver对象WebDriver driver = new ChromeDriver();// 打开Web页面driver.get("http://localhost:8080/#/");// 通过ID定位到账户输入框Thread.sleep(1000);WebElement account=driver.findElement(By.id("account"));Thread.sleep(1000);account.sendKeys("123456@qq.com");// 获取id属性的值System.out.println("id属性的值:"+account.getAttribute("id"));// 获取元素的尺寸System.out.println("元素的尺寸:"+account.getSize());// 获取元素的位置坐标System.out.println("元素的位置坐标:"+account.getLocation());// 获取该元素是否可见System.out.println("元素是否可见:"+account.isDisplayed());Thread.sleep(1000);driver.findElement(By.id("password")).sendKeys("123456");// 点击按钮driver.findElement(By.id("login_btn")).click();Thread.sleep(1000);driver.close();}}
执行结果如下:
id属性的值:account元素的尺寸:(360, 40)元素的位置坐标:(570, 319)元素是否可见:true
获取页面的信息getTitle():用于获得当前页面的title 。getCurrentUrl() : 用户获得当前页面的URL 。getPageSource(): 获取页面代码getWindowHandle():获取当前页面句柄getWindowHandles():获取浏览器所有的句柄,返回的是一个集合 示例代码如下:
import org.openqa.selenium.By;import org.openqa.selenium.Dimension;import org.openqa.selenium.WebDriver;import org.openqa.selenium.WebElement;import org.openqa.selenium.chrome.ChromeDriver;import org.openqa.selenium.interactions.Actions;import org.testng.annotations.Test;public class SeleniumTest {@Testpublic void login() throws InterruptedException {// 设置驱动System.setProperty("webdriver.chrome.driver", "/Users/yangchen/MyProject/SeleniumStudy/driver/chromedriver");// 创建一个WebDriver对象WebDriver driver = new ChromeDriver();// 打开Web页面driver.get("http://localhost:8080/#/");System.out.println("当前URL:"+driver.getCurrentUrl());System.out.println("当前网站标题:"+driver.getTitle());System.out.println("当前前端代码:"+driver.getPageSource());System.out.println("当前页面句柄:"+driver.getWindowHandle());System.out.println("当前所有句柄:"+driver.getWindowHandles());Thread.sleep(1000);driver.close();}}
执行结果如下:
信息: Found CDP implementation for version 98 of 97当前URL:http://localhost:8080/#/当前网站标题:invest-project当前前端代码:中间省略当前页面句柄:CDwindow-431B77CAF29AD1E24466BDA6E83DB971当前所有句柄:[CDwindow-431B77CAF29AD1E24466BDA6E83DB971]
浏览器cookie操作getCookies():获得所有cookie信息 。getCookieNamed(String name): 返回字典的key为name的Cookie信息 。addCookie(cookie dict):添加Cookie 。“cookie_dict”指字典对象,必须有 name和value值 。deleteCookieNamed(String name):删除Cookie信息 。“name”是要删除的cookie的名称; “optionsString” 是该Cookie的选项,目前支持的选项包括“路径”,“域”。deleteAllCookies():删除所有cookie信息 。
示例代码如下:
import org.openqa.selenium.*;import org.openqa.selenium.chrome.ChromeDriver;import org.testng.annotations.Test;import java.util.Set;public class SeleniumTest {@Testpublic void login() throws InterruptedException {// 设置驱动System.setProperty("webdriver.chrome.driver", "/Users/yangchen/MyProject/SeleniumStudy/driver/chromedriver");// 创建一个WebDriver对象WebDriver driver = new ChromeDriver();driver.get("http://localhost:8080/#/");// 设置CookiesCookie c1 = new Cookie("name", "tester");Cookie c2 = new Cookie("sex", "male");driver.manage().addCookie(c1);driver.manage().addCookie(c2);// 获取CookiesSet cookies = driver.manage().getCookies();System.out.println(cookies);driver.quit();}}
调用JavaScript代码
WebDriver提供了executeScript()方法来执行JavaScript代码
前端代码
测试自动化测试内容1内容2内容3内容4内容5内容6
JAVA代码
import org.openqa.selenium.*;import org.openqa.selenium.chrome.ChromeDriver;import org.testng.annotations.Test;public class SeleniumTest {@Testpublic void login() throws InterruptedException {// 设置驱动System.setProperty("webdriver.chrome.driver", "/Users/yangchen/MyProject/SeleniumStudy/driver/chromedriver");// 创建一个WebDriver对象WebDriver driver = new ChromeDriver();// 打开Web页面driver.get("http://localhost:63343/invest-project-ui/public/Test.html?_ijt=g0len3inipqu9bfu2vej06nd81&_ij_reload=RELOAD_ON_SAVE");Thread.sleep(2000);((JavascriptExecutor)driver).executeScript("window.scrollTo(100,450);");Thread.sleep(2000);driver.quit();}}
执行结果
获取窗口截图
值得注意的是,这里FileUtils需要添加maven坐标 , 导入进来,坐标地址如下:
commons-iocommons-io2.6
JAVA代码如下
import org.openqa.selenium.*;import org.openqa.selenium.chrome.ChromeDriver;import org.testng.annotations.Test;import java.io.File;import java.io.IOException;import org.apache.commons.io.FileUtils;import java.util.Set;public class SeleniumTest {@Testpublic void login() throws InterruptedException {// 设置驱动System.setProperty("webdriver.chrome.driver", "/Users/yangchen/MyProject/SeleniumStudy/driver/chromedriver");// 创建一个WebDriver对象WebDriver driver = new ChromeDriver();driver.get("http://localhost:8080/#/");File srcFile = ((TakesScreenshot)driver).getScreenshotAs(OutputType.FILE);try {FileUtils.copyFile(srcFile,new File("./screenshot.png"));} catch (IOException e) {e.printStackTrace();}driver.quit();}}
截图如下:
【Java版本 Web selenium自动化】本文到此结束,希望对大家有所帮助!
猜你喜欢
- 轿车托运到天津怎么收费 天津轿车托运公司收费标准
- 五个月的宝宝会叫妈妈,是不是很聪明的表现?
- 抖音直播间报白什么意思?有哪几种报白方式?
- 如何鉴别你身边的女孩是不是女同志?
- 为什么垂钓提竿中鱼老是脱钩?
- 什么是抖音报白
- 野钓经常遇到脱钩是因为钩子小了吗?
- 房贷53万花30年还清,利息就要55万,利息比本金还多正常吗?你怎么看?
- 出现在婴儿时期 智力低下的婴
