目录
前言
Selenium是开源的自动化测试框架,通过Selenium可以记录你在浏览器执行的操作,录制并可以导出为Java代码。导出的代码可以执行,以到达复现你对浏览器的操作。代码中最关键的就是WebDriver,它可以通过各种浏览器的驱动来驱动浏览器。
前提准备
geckodriver.exe / chromedriver.exe / IEDriverServer.exe
Firefox / chrome / IE
selenium-server-standalone-3.141.59.jar
这三个分别是浏览器驱动程序、浏览器、jar包。他们之间不同不版本可能会引起不兼容问题,但是厂商没有给出具体的标准,暂时最三者新版同时工作不会有问题。
WebDriver对浏览器的操作
(1)打开浏览器
// 火狐浏览器
System.setProperty("webdriver.gecko.driver", "D:\\demo\\geckodriver.exe");
System.setProperty("webdriver.firefox.bin","D:\\ProgramFiles\\MozillaFirefox\\firefox.exe");
WebDriver driver = new FirefoxDriver();
// 谷歌浏览器
System.setProperty("webdriver.chrome.driver", "D:\\demo\\chromedriver.exe");
WebDriver driver = new ChromeDriver();
// IE浏览器
System.setProperty("webdriver.ie.driver", "D:\\demo\\IEDriverServer.exe");
WebDriver driver = new InternetExplorerDriver();
第一个参数对于使用的浏览器来说是固定的,需要记住。第二个参数就是浏览器驱动程序的路径。对于火狐浏览器,当下载的路径没有默认在c盘时,需要加上路径指明语句,第一个参数固定,第二个参数是浏览器路径。
(2)关闭浏览器
driver.close();//只是关闭当前页面,不会geckodriver的进程
driver.quit();//彻底关闭浏览器,geckodriver的进程关闭,释放资源
这两个方法的区别务必记住。一般在程序最后都会加上quit语句,如果不加那么每执行一次代码就启动一次驱动程序,多次启动会相当占用内存资源,导致出现未知错误。
(3)访问网页
String baseUrl="https://www.baidu.com/";
driver.get(baseUrl);
driver.navigate().to(baseUrl); // 两种方式都可以
(4)返回 / 前进 / 刷新
driver.navigate().forward();
driver.navigate().back();
driver.navigate().refresh();
(5)浏览器尺寸的控制
// 设置浏览器大小
Dimension size = new Dimension(300, 400);
driver.manage().window().setSize(size);
// 浏览器最大化
driver.manage().window().maximize();
获取页面信息
// 获取title标签中的内容
String title = driver.getTitle();
// 获取当前url
String current = driver.getCurrentUrl();
// 获取网页的代码信息
String htmlsrc = driver,getPageSource();
可以syso一下看看具体内容。
自定义profile
我们平时WebDriver driver = new FirefoxDriver();这样做,启动的是一个和原始状态一样的浏览器。但是在测试时会需要一些已有的用户信息,cookie信息等,这就需要自行配置profile。
打开cmd,输入D:\\firefox\\firefox.exe -p -no -remote,这里-p -no -remote之前是浏览器的路径,因人而异。回车后弹出配置页面。
默认的文件是default,你可以创建配置文件,自定义名称然后启动Firefox, 这样启动的浏览器就是全新的,配置过程中还会让你选择新建的配置文件路径,这样你打开的浏览器就是全新的。想切换回原有的浏览器,可以再次打开配置,双击default。
在测试的时候也可以通过代码控制打开自己配置的浏览器。
ProfilesIni allprofiles = new ProfilesIni();
FirefoxProfile pro = allprofiles.getProfile("test01");
FirefoxOptions options = new FirefoxOptions();
options.setProfile(pro);
System.setProperty("webdriver.gecko.driver", "D:\\demo\\geckodriver.exe");
System.setProperty("webdriver.firefox.bin","D:\\ProgramFiles\\MozillaFirefox\\firefox.exe");
WebDriver driver = new FirefoxDriver(options);
元素定位
测试时我们需要操控网页的某些控件例如超链接、文本框、按钮等,需要我们找到要操控的元素。定位的本质还是查找html代码。
(1)ID
driver.findElement(By.id("id值"))
例如:
<input id="kw" class="s_ipt" name="wd" maxlength="100" autocomplete="off" type="text">
WebElement element = driver.findElement(By.id("kw"));
WebElement submitButton= driver.findElement(By.id("submit"));
submitButton.click();
(2)name
例如:
<input id="kw" class="s_ipt" name="wd" maxlength="100" autocomplete="off" type="text">
WebElement element = driver.findElement(By.name("wd"));
(3)className
例如:
<input id="kw" class="s_ipt" name="wd" maxlength="100" autocomplete="off" type="text">
WebElement element = driver.findElement(By.className("s_ipt "));
(4)tagName
例如:
<input id="kw" class="s_ipt" name="wd" maxlength="100" autocomplete="off" type="text">
WebElement element = driver.findElements(By.tagName("input"));
一个页面的tagName有多个,建议使用findElements()
WebElement searchInput= driver.findElements(By.tagName("a"));
List<WebElement> scriptList= driver.findElements(By.tagName("a"));
scriptList是一个集合,其中存放着所有的a标签,按顺序存储。
(5)linkTest
专门用来查找超链接
例如:
<a class="mnav" href="http://news.baidu.com" target="_blank">新闻</a>
WebElement newsLink= driver.findElement(By.linkText("新闻"));
newsLink.click();
(6)partialLinkTest
partialLinkTest是linkTest的补充,有些文本链接比较长,这时可以去文本链接中的一部分进行定位,只要这一部分可以唯一的标识这个链接。
例如:
<a class="mnav" href="http://www.hao123.com" target="_blank">hao123</a>
WebElement pLink= driver.findElement(By.partialLinkText("123"));
(7)xpath
绝对路径定位(不建议使用):
WebElement button= driver.findElement(By.xpath("/html/body/div[1]/input"));
xpath中的内容可以在浏览器控制台中找到要控制的元素节点,右键找到xpath,然后赋值。内容的意思就是html标签中body标签中第一个div中的input。不推荐使用的原因是网页代码出现改动,那么测试代码也要修改,不方便。
相对路径定位(结合属性使用):
driver.findElement(By.xpath("//input[@value='查询']"));
在代码中找所有input标签中,属性值是查询的input标签,也可以省略标签:
driver.findElement(By.xpath("//*[@value='查询']"));
也可以将多个条件填入[ ]中,就可以限制多个条件下进行查找:
driver.findElement(By.xpath("//input[@id='kw' and @class='su']"));
使用索引定位:
WebElement button= driver.findElement(By.xpath("//input[1]"));
这样就锁定了所有标签中的第一个标签。
模糊的属性值:
WebElement button= driver.findElement(By.xpath("//img[starts-with(@alt,'div1')]"));
By.xpath("//input[ends-with(@id,'很漂亮')]");(无效)
WebElement button= driver.findElement(By.xpath("//img[contains(@alt,'div1')]"));
有的时候,第一次打开网页,标签中的属性值alt是div1,第二次打开网页alt就变成了div2。这种情况下,就用到了stars-with,确保在属性多次变动的时候能根据第一次不变的特点找到元素。有start-with也有ned-with,不过end-with已经是无效方法了。那么在属性多次变动的过程中,contains可以保证alt一变为div1,就锁定元素。
使用页面元素文本定位:
driver.findElement(By.xpath("//a[text()='hao123']")).click();
driver.findElement(By.xpath("//a[contains(text(),'hao')]")).click();
(8)CSS
绝对路径(不推荐):
WebElement userName = driver.findElement(By.cssSelector("html body div div form input"));
WebElement userName = driver.findElement(By.cssSelector("html >body > div > div > form > input"));
By.cssSelector("html>body>div[1]>input[type='button']"));
相对路径(结合属性):
// class属性
By.cssSelector("input.spread");
// id属性
By.cssSelector("input#divinput");
// 复合属性
By.cssSelector("img[alt='aaa'][href='****']");
// 模糊匹配
// 1、开头包含
a[href ^= 'http://www.baidu']
// 2、结尾包含
a[href $= 'baidu.com']
// 3、包含
a[href *= 'baidu']
// 子页面元素的查找
By.cssSelector("div#div1>input#divinput1");
总结:在进行元素定位的时候,xpath使用的情况较多。像className、tagName由于可重复的特点,不方便直接锁定元素。css定位速度 比xpath快。
对比css和xpath: