WebDriver API实例详解(java)
一、访问网页地址:get(url)
Java代码
String url="http://www.baidu.com";
driver.get(url);
二、刷新当前网页:navigate().refresh()
java代码
String url="http://www.baidu.com"; driver.get(url); driver.findElement(By.id("kw")).sendKeys("123123123"); Thread.sleep(2000); //刷新浏览器当前网页 driver.navigate().refresh();
三、获取页面title属性:getTitle()
java代码
String url="http://www.baidu.com"; driver.get(url); //获取页面的title属性 String title=driver.getTitle(); System.out.println(title); //断言页面上的title值是不是 百度一下,你就知道 Assert.assertEquals("百度一下,你就知道",title);
四、获取页面源代码:getPageSource()
java代码
String url="http://www.baidu.com"; driver.get(url); //获取页面源代码 String pagesource=driver.getPageSource(); System.out.println(pagesource); //断言源代码中是否包含“百度一下,你就知道” Assert.assertTrue(pagesource.contains("百度一下,你就知道"));
五、获取当前页面的URL地址:getCurrentUrl()
Java代码
String url="http://www.baidu.com/"; driver.get(url); //获取URL地址 String getUrl=driver.getCurrentUrl(); //断言 Assert.assertEquals("https://www.baidu.com/", getUrl);
六、清空文本框:clear()
java代码
WebElement baiduKw=driver.findElement(By.id("kw")); baiduKw.sendkeys("selenium"); baiduKw.clear();
七、文本框输入文本:sendkeys()
java代码
WebElement baiduKw=driver.findElement(By.id("kw"));
baiduKw.sendKeys("selenium");
八、单击元素:click()
java代码
WebElement baiduKW=driver.findElement(By.cssSelector("#su")); baiduKW.click();
九、双击元素
HTML源码
<input id='inputBox' type="button" style="width:100px;height:50px;" ondblclick="javascript:this.style.background='red'">请双击按钮</>
Java代码
WebElement inputB=driver.findElement(By.xpath("//input[@id='inputBox']")); //声明Action对象 Actions ac=new Actions(driver); //使用doubleClick方法在定位的元素中进行鼠标的双击操作 ac.doubleClick(inputB).build().perform();
十、获取文本:getText()
java代码
//定位百度首页右上角的 新闻 WebElement XW=driver.findElement(By.xpath("//*[@name='tj_trnews']")); //获取文本 String Text1=XW.getText(); //校验文本内容 Assert.assertEquals(Text1,"新闻");
十一、判断元素是否展示:isDisplayed()
java代码
WebElement baiduSu=driver.findElement(By.xpath("//*[@id='su']")); //获取 百度一下 按钮是否显示 boolean Su=baiduSu.isDisplayed(); //校验结果 Assert.assertTrue(Su);
十二、判断元素是否激活:isEnabled()
HTML源码:
<td>Button按钮</td> <td class="SubButton"> <div id='button'> <input name="buttonSub" type='button' class='button' value='Submit' disabled="disabled"/> </div> </td>
Java代码:
//定位元素,判断是否激活 boolean submit=driver.findElement(By.xpath("//*[@name='buttonhtml']")).isEnabled(); //校验结果 Assert.assertTrue(submit);
十三、判断选择框是否被选中:isSelected()
HTML源码:
<td>RadioBox单选框</td> <td class="widgetStyle"> <div id='radio'> <input type='radio' name="identity" class='a'/><label>a</label></br> <input type='radio' name="identity" class='b'/><label>b</label></br> <input type='radio' name="identity" class='c'/><label>c</label></br> <input type='radio' name="identity" class='d'/><label>d</label> </div> </td>
java代码:
//定位a单选框 WebElement a=driver.findElement(By.xpath("//*[@id='radio']/input[1]")); //点击单选框 a.click(); //获取单选框是否被选中 boolean b1=a.isSelected(); //校验结果 Assert.assertTrue(b1);
十四、select下拉框处理
1. selectByIndex() 根据索引来选取,从0开始
2. selectByValue() 根据属性value的属性值来选取
3. selectByVisibleText()根据标签之间的Text值,也就是页面显示的
注意:导入的包要正确不然会报错。 import org.openqa.selenium.support.ui.Select;
单选下拉列表:
HTML源码
<tr> <td>Select下拉列表</td> <div id='select'> <select id="selected"> <option value ="a">huawei</option> <option value ="b">oppo</option> <option value="c">vivo</option> <option value="d">xiaomi</option> <option value="e">hongmi</option> <option value="f">meizu</option> </select> </div> </tr>
Java代码
package cn.WebDriverAPI; //单选下拉框 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.Select; import org.testng.Assert; import org.testng.annotations.AfterMethod; import org.testng.annotations.Test; public class downList { public WebDriver driver; @Test public void test(){ System.setProperty("webdriver.chrome.driver", "E://chromedriver.exe"); driver=new ChromeDriver(); driver.get("file:///C:/Users/Administrator.USER-20180602NR/Desktop/selenium.html"); WebElement s=driver.findElement(By.xpath("//select[@id='selected']")); Select select=new Select(s); //isMultiple表示此下拉框列表是否允许多选,返回结果应为false Assert.assertFalse(select.isMultiple()); //输出isMultiple方法返回的值 Boolean b=select.isMultiple(); System.out.println("b:"+b); //通过选项的文字进行选中 select.selectByVisibleText("oppo"); //获取当前被选中的下拉列表选项文本并赋给text1 String text1=select.getFirstSelectedOption().getText(); //断言 Assert.assertEquals("oppo", text1); System.out.println("文本"+text1); //使用下拉列表选项的value属性值进行选中操作 select.selectByValue("c"); //获取当前被选中的下拉列表选项文本并赋给text2 String text2=select.getFirstSelectedOption().getText(); //断言 Assert.assertEquals("vivo",text2); //通过索引选择,从0开始 select.selectByIndex(3); String text3=select.getFirstSelectedOption().getText(); Assert.assertEquals("xiaomi",text3); } @AfterMethod public void afterMethod(){ try { Thread.sleep(2000); } catch (InterruptedException e) { e.printStackTrace(); } driver.quit(); } }
十五、多选的下拉列表:
HTML源码
<select id="selects" multiple="multiple"> <option value="java">java</option> <option value="c">c</option> <option value="c++">c++</option> <option value="VB">VB</option> <option value="php">php</option> <option value="python">python</option> <option value="ruby">ruby</option> </select>
java代码
WebElement mus=driver.findElement(By.id("selects")); Select select=new Select(mus); //断言下拉列表是否支持多选,支持多选isMultiple方法则返回True Assert.assertTrue(select.isMultiple()); //通过索引选择 select.selectByIndex(0); //获取当前被选中选项的文字 String text=select.getFirstSelectedOption().getText(); //断言获取到的文字是否符合实际 Assert.assertEquals("java",text); //通过value值选择 select.selectByValue("c"); //通过选项文字选择 select.selectByVisibleText("VB"); try { Thread.sleep(2000); } catch (InterruptedException e) { e.printStackTrace(); } //取消所有选项的选中状态 select.deselectAll();
十六、操作radio单选框
HTML源码
<div id='radio'> <input type='radio' name="fruit" class='yi'/><label>yi</label></br> <input type='radio' name="fruit" class='er'/><label>er</label></br> <input type='radio' name="fruit" class='san'/><label>san</label></br> <input type='radio' name="fruit" class='si'/><label>si</label></br> <input type='radio' name="fruit" class='wu'/><label>wu</label> </div>
java代码
//查找class属性为yi的按钮 WebElement yi=driver.findElement(By.className("yi")); //判断此按钮是否为选中状态,如果不是则调用click方法进行点击 if(!yi.isSelected()) yi.click(); //断言class属性值为yi的按钮处于被选中状态。此时isSelected方法返回值应为True Assert.assertTrue(yi.isSelected()); //输出isSelected方法返回值 Boolean b=yi.isSelected(); System.out.println("b:"+b);
十七、操作CheckBox复选框
HTML源码
<div id='checkboxs'> <input type="checkbox" name="checkbox2"/><label>liu</label></br> <input type="checkbox" name="checkbox3"/><label>qi</label></br> <input type="checkbox" name="checkbox4"/><label>ba</label></br> <input type="checkbox" name="checkbox5"/><label>jiu</label></br> <input type="checkbox" name="checkbox6"/><label>shi</label> </div>
java代码
//查找name值为checkbox2的复选框 WebElement liu=driver.findElement(By.xpath("//input[@name='checkbox2']")); //判断如果此复选框还未被选中,则调用click方法单击选中 if(!liu.isSelected()) liu.click(); //断言此复选框被成功选中 Assert.assertTrue(liu.isSelected()); //停2秒看效果 Thread.sleep(2000); //判断如果此复选框处于被选中状态则再次调用click方法进行单击取消复选框的选中状态 if(liu.isSelected()) liu.click(); //断言此复选框处于非选中状态 Assert.assertFalse(liu.isSelected()); Thread.sleep(2000); //再次选中name值为checkbox2的复选框 liu.click(); Thread.sleep(2000); //查找所有type属性值为 checkBox的复选框,并存在list容器内 List<WebElement> checkboxs= driver.findElements(By.xpath("//input[@type='checkbox']")); //遍历容器中所有元素,判断每个复选框处于非选中状态,非选中状态的则调用click方法单击 //因为name值为checkbox2的复选框在上一步时已被选中所有在for循环中不会再被点击 for(WebElement checkbox:checkboxs){ System.out.println(checkbox.isSelected()); Thread.sleep(1000); if(!checkbox.isSelected()) checkbox.click(); }
十八、检查页面元素文本是否符合预期
Java代码
driver.get("http://www.baidu.com"); //获取网页title文字 String text=driver.getTitle(); Assert.assertEquals("百度一下,你就知道",text); //判断title文字内容是否包含 百度一下 Assert.assertTrue(text.contains("百度一下")); //判断title文字内容开始文字是不是 百度 Assert.assertTrue(text.startsWith("百度")); //判断title文字内容的末尾文字是不是 知道 Assert.assertTrue(text.endsWith("知道"));
十九、判断页面元素是否存在
Java代码
package cn.WebDriverAPI; //判断页面元素是否存在 import org.openqa.selenium.By; import org.openqa.selenium.NoSuchElementException; import org.openqa.selenium.WebDriver; import org.openqa.selenium.WebElement; import org.openqa.selenium.chrome.ChromeDriver; import org.testng.annotations.AfterMethod; import org.testng.annotations.Test; import junit.framework.Assert; public class ElementPresent { WebDriver driver; //写一个判断页面元素是否存在的方法 IsElementPresent private boolean IsElementPresent(By by){ try{ //如果使用传入的参数by能找到页面元素,则函数返回true,表示成功地找到页面元素 driver.findElement(by); return true; }catch(NoSuchElementException e){ //如果使用传入的参数by 没有找到页面元素,返回false return false; } } @Test public void test(){ System.setProperty("webdriver.chrome.driver","E://chromedriver.exe"); driver=new ChromeDriver(); driver.get("http://www.baidu.com"); //调用写的IsElementPresent方法查找元素 if(IsElementPresent(By.xpath("//input[@name='wd']"))==true){ //如果成功定位到页面元素,则把页面元素对象存储到element变量中 WebElement element=driver.findElement(By.xpath("//input[@name='wd']")); //判断element变量对象是否处于可能状态。如果可用则输入“selenium”关键字 if(element.isEnabled()==true){ element.sendKeys("selenium"); } }else{ //如果页面元素没找到,则将此用例设置为失败,并打印原因 Assert.fail("页面元素没找到"); } } @AfterMethod public void aftermethod() throws InterruptedException{ Thread.sleep(2000); driver.quit(); } }
二十、通过句柄来识别和操作新弹出的浏览器窗口
HTML源码
<html> <head> <title>Selenium</title> </head> <body> <td>Input输入框</td> <div id='ifra' > <input type="text" id="input" name='ips'/> </div> </br> <div id='open'> <a href="http://www.baidu.com" class='open' target='bank'>Open new window打开百度</a><br> </div> <br> </body> </html>
java代码
//定位点击元素,打开新的窗口 driver.findElement(By.className("open")).click(); //获取当前页面句柄 String handle=driver.getWindowHandle(); //获取所有页面句柄,并循环判断不是当前的句柄就做选取switchTo() for(String handles:driver.getWindowHandles()){ if(handles.equals(handle)) continue;//跳过本次循环,不执行下面的命令直接进行下一次循环 //break; //结束全部for循环 driver.switchTo().window(handles); } //在新打开的页面中进行操作 driver.findElement(By.id("input")).sendKeys("新页面"); //关闭新页面 driver.close(); //选择原来的句柄,切到原来的界面 driver.switchTo().window(handle); //在原来的界面进行操作 driver.findElement(By.id("input")).sendKeys("旧页面");
二十一、使用Title属性识别和操作新淡出的浏览器窗口
HTML源码
<html> <head> <title>SeleniumElement</title> </head> <body> <td>Input输入框</td> <div id='ifra' > <input type="text" id="input" name='ips'/> </div> </br> <div id='open'> <a href="http://www.baidu.com" class='open' target='bank'>Open new window打开百度</a><br> </div> <br> </body> </html>
Java代码
//定位点击连接元素,打开新窗口 driver.findElement(By.xpath("//a[text()='Open new window打开百度']")).click(); //获取当前页面句柄 String handle=driver.getWindowHandle(); //获取所有页面句柄 Set<String> allHandle=driver.getWindowHandles(); //如果容器存储的对象不为空,则遍历allHandle中所有句柄 if(!allHandle.isEmpty()){ for(String windowhandle:allHandle){ try{ //调用driver.switchTo().window(windowhandle).getTitle()方法 //获取浏览器的Title属性,并判断是否是“百度一下,你就知道” if(driver.switchTo().window(windowhandle).getTitle().equals("百度一下,你就知道")) //判断正确则说明是百度首页,则在输入框中输入 javaselenium driver.findElement(By.xpath("//input[@id='kw']")).sendKeys("javaselenium"); }catch(NoSuchWindowException e){ //如果没有,抛出NoSuchWindowException,打印异常的堆栈信息 e.printStackTrace(); } } } //返回最开始打开的浏览器页面 driver.switchTo().window(handle); //断言浏览器页面的Title属性值是否是 SeleniumElement Assert.assertEquals(driver.getTitle(),"SeleniumElement"); driver.findElement(By.xpath("//input[@id='input']")).sendKeys("123456");
二十二、使用页面文字内容识别和处理新弹出的浏览器窗口
HTML源码(同二十一)
java代码
//打开新窗口 百度页面 driver.findElement(By.xpath("//a[text()='Open new window打开百度']")).click(); //获取当前页面的句柄 String OldHandle=driver.getWindowHandle(); //获取所有句柄 Set<String> AllHandle=driver.getWindowHandles(); //判断如果AllHandle不为空则进行遍历AllHandle if(!AllHandle.isEmpty()){ try{ for(String Handle:AllHandle){ //调用driver.switchTo().window(Handle).getPageSource().contains()方法 //逐个获取页面的源码,判断是否包含“百度一下,你就知道” if(driver.switchTo().window(Handle).getPageSource().contains("百度一下,你就知道")) //如果判断成立,则说明当前页面为百度首页,并在输入框中输入 java driver.findElement(By.xpath("//input[@id='kw']")).sendKeys("java"); } }catch(NoSuchWindowException e){ e.printStackTrace(); } //调用driver.switchTo().window()方法切到原页面,在输入框中输入old页面 driver.switchTo().window(OldHandle).findElement(By.xpath("//input[@id='input']")).sendKeys("old页面"); //断言页面源码包含 SeleniumElement Assert.assertTrue(driver.getPageSource().contains("SeleniumElement"));
二十三、alert弹窗
HTML源码:
<input id='test' type='button' onclick="alert('这是一个alert弹框');" value='单击此按钮,弹出alert弹窗'>
java代码:
//定位Alert弹窗 WebElement At=driver.findElement(By.id("test")); //点击alert按钮 At.click(); //选择alert弹窗 Alert alert=driver.switchTo().alert(); //获取alert弹窗中的文本内容 String text=alert.getText(); //校验alert弹窗中的文本 Assert.assertEquals(text,"这是一个alert弹框"); //点击alert弹窗中的确定按钮 alert.accept();
二十四、Confirm弹窗
HTML源码:
<input id='testcf' type='button' onclick="confirm('这是一个confirm弹框');" value='单击此按钮,弹出confirm弹窗'></input>
java代码:
//定位confirm按钮 WebElement Cf=driver.findElement(By.xpath("//*[@id='testcf']")); Cf.click(); //选取alert弹窗 Alert confirm=driver.switchTo().alert(); //点击confirm弹窗上的确定按钮 confirm.accept(); //点击confirm弹窗上面的取消按钮 //confirm.dismiss();
二十五、prompt弹窗
HTML源码
<input id='testpt' type='button' onclick="prompt('这是一个prompt弹框');" value='单击此按钮,弹出prompt弹窗'></input>
Java代码
//定位prompt按钮 WebElement Cf=driver.findElement(By.xpath("//*[@id='testpt']")); Cf.click(); //选取alert弹窗 Alert prompt=driver.switchTo().alert(); //在prompt弹窗的输入框中输入文字 prompt.sendKeys("在prompt弹窗中的输入框中输入123za。。。"); Thread.sleep(3000); //点击prompt弹窗中的确定按钮 prompt.accept(); //点击Prompt弹窗中的取消按钮 //prompt.dismiss();
二十六、Frame(iFrame)中元素的定位和操作
frame标签有frameset、frame、iframe三种,frameset在selenium中跟其他普通标签没有区别,不需要层层切换,不影响正常的定位。而frame与iframe需要层层切,他俩对selenium定位而言是一样的,selenium有一组方法对frame(iFrame)进行操作。具体方法有如下几种(java代码中都有用到):
① 使用iframe标签的id或name属性值定位到iframe
② 使用WebElement方法定位到iframe
③ 使用index方法定位到iframe
④ 使用iframe中的HTML源码定位到iframe
HTML源码
<html> <head> <title>Frame</title> <meta http-equiv=Content-Type content="text/html;charset=utf-8"> <meta http-equiv=X-UA-Compatible content="IE=edge,chrome=1"> <meta content=always name=referrer> </head> <body> <td>Input输入框</td> <div id='put' > <input type="text" id="input" name='ips'/> </div> <br> <div id='iFrame'> <td>Iframe1</td><br> <iframe width=700 height=153 id=iFrameId frameborder=0 src="Xpath.html"></iframe> <br> <br> <td>Iframe2</td><br> <iframe width=700 height=150 name=iFrameName frameborder=0 src="Xpath.html"></iframe> </div> </body> </html>
java代码
//通过iframe标签的id属性值定位到Iframe1中的iframe,并将控制权交给它 driver.switchTo().frame("iFrameId"); //定位iframe框架1中的输入框并输入 iFreme1 WebElement iF1=driver.findElement(By.xpath("//input[@id='input']")); iF1.sendKeys("iFreme1"); //等2秒看效果 Thread.sleep(2000); //清除文本 iF1.clear(); //控制权交回原来的界面 driver.switchTo().defaultContent(); //在外面的输入框中输入 defaultContend WebElement in=driver.findElement(By.xpath("//input[@id='input']")); in.sendKeys("defaultContend"); Thread.sleep(2000); in.clear(); Thread.sleep(2000); //通过iframe的name属性值定位Iframe2中的iframe,并将控制权交给它 driver.switchTo().frame("iFrameName"); //在Iframe框架2中的输入框中输入iFrame2 WebElement iF2=driver.findElement(By.xpath("//input[@id='input']")); iF2.sendKeys("iFreme2"); Thread.sleep(2000); iF2.clear(); //控制权交回原来的界面 driver.switchTo().defaultContent(); Thread.sleep(2000); //通过WebElement方法定位到iFrame。 //通过iframe标签的height属性值定位iframe1 WebElement ifr1=driver.findElement(By.xpath("//iframe[@height='153']")); //控制权交给iframe1 driver.switchTo().frame(ifr1); //定位里面的输入框 WebElement iFrame1input=driver.findElement(By.id("input")); //输入 WebElement iFrame1input.sendKeys("WebElement"); Thread.sleep(2000); //清除文本 iFrame1input.clear(); //控制权交给原来的界面 driver.switchTo().defaultContent(); //使用index方法进入指定iframe,索引号从 0 开始 //控制权交给iframe2。如果是0的话切到iframe1中 driver.switchTo().frame(1); //定位里面的输入框 WebElement iFrame2input=driver.findElement(By.id("input")); //输入 WebElement iFrame2input.sendKeys("index"); //清除文本 Thread.sleep(2000); iFrame2input.clear(); //控制权交给原来的界面 driver.switchTo().defaultContent(); Thread.sleep(2000); //使用iframe中的HTML源码内容来定位操作iframe //找到页面中所有iframe,并存储到iframes容器里 List<WebElement> iframes= driver.findElements(By.tagName("iframe")); //遍历iframes中所有iframe页面,查找包含 iFrameId 的iframe页面 for(WebElement iframe:iframes){ //将控制权交给iframe driver.switchTo().frame(iframe); //逐个iframe页面进行判断是否包含 iFrameId 关键字 if(driver.getPageSource().contains("iFrameId")){ //判断成立说明找到指定iframe页面,则在当前iframe页面中的输入框中输入 PageSourceIFrameID WebElement pg=driver.findElement(By.id("input")); pg.sendKeys("PageSourceIFrameID"); //找到指定iframe后退出for循环 break; }else{ //如果没有找到指定iframe,则退出当前iframe页面。for循环继续进入下一轮循环 driver.switchTo().defaultContent(); } } //找到指定iframe页面并执行完后面语句后退出当前iframe页面 driver.switchTo().defaultContent(); //在输入框中输入 控制权回到原点 driver.findElement(By.id("input")).sendKeys("控制权回到原点");
二十七、操作浏览器的Cookie
可以在浏览器开发者工具页面查看效果,查看cookies路径:APPlication->Cookies
java代码
driver.get("http://www.baidu.com"); //获取cookies Set<Cookie> data = driver.manage().getCookies(); System.out.println(data); //获得cookies个数 System.out.println(driver.manage().getCookies().size()); //删除所有cookies driver.manage().deleteAllCookies(); //获得cookies个数,此时cookies的个数为0 System.out.println(driver.manage().getCookies().size()); //设置cookies Cookie c1 = new Cookie("addCookies", "123456789"); driver.manage().addCookie(c1); //新增了一条,此时cookie个数为1 System.out.println(driver.manage().getCookies().size());
二十八、查看输入框输入的字符
java代码
driver.get("http://www.baidu.com"); WebElement input=driver.findElement(By.id("kw")); input.sendKeys("Selenium"); //调用getAttribute方法获取到输入框中的文本内容,并赋给text String text=input.getAttribute("value"); //断言 Assert.assertEquals("Selenium",text); System.out.println(text);