selenium自动化测试学习5-selenium的常用类介绍
1.Alert和Action类的使用
1.1Alert类
具体样例如下:
html源码如下:
<div id="alert"> <input class="alert" type="button" onclick="display_alert()" value="Alert"/> </div
实现代码如下:
public void alertTest(){ //定位到alert按钮并且将其传给一个WebElement WebElement ele_alert = driver.findElement(By.xpath("//div[@id='alert']/input[1]")); //使得driver可以具有某些特定动作 Actions action = new Actions(driver); //然后使得driver点击alert框 action.click(ele_alert).perform(); //将此时的driver跳转到alert弹出框上 Alert alt = driver.switchTo().alert(); //打印出弹出框的内容 String str = alt.getText(); System.out.println(str); //取消弹出框 alt.dismiss(); //driver.switchTo().alert(); }
说明如下:
说明【1】使用前必须导入import org.openqa.selenium.Alert;和import org.openqa.selenium.interactions.Actions;否则无法使用该类以及它们的方法;
说明【2】使用Action类实现点击click()操作时后面必须跟着perform()方法;
1.2Action类
首先请明确,Action类主要是针对鼠标操作所封装的类。应用场景主要是:
这种action是鼠标移动在上面的时候,就会显示Hello World!请注意此时鼠标无需点击操作,此时源代码如下:
html显示如下:
<div id="action"> <input class="over" type="button" onmouseout="mouseOut()" onmouseover="mouseOver()" value="Action"/> <div id="over"> </div> </div>
实现代码如下:
public void actionTest(){ WebElement ele_action = driver.findElement(By.xpath("//input[@class='over']")); Actions actionone = new Actions(driver); actionone.moveToElement(ele_action).perform(); //这个id是从javascript里找到的 String actionmessage = driver.findElement(By.id("over")).getText(); System.out.println(actionmessage); }
需要说明如下:
说明【1】Action类调用任何操作方法后都要加上perform()方法;
说明【2】我们示例中的Hello World!是写在javascript中的,取得它的定位时一般采用id。即document.getElementById("over")使用的id同样适用于findelementbyid方法中。
function mouseOver(){ document.getElementById("over").innerHTML="<div class='display'>Hello World!</div>"; } function mouseOut(){ document.getElementById("over").innerHTML=""; }
1.3upload上传文件操作
实例:
html源码如下:
div id="upload"> <input id="load" type="file"/> </div>
分析思路:我们把上传操作现象成:获取到内容后发送操作,需要获取的内容即是文件相对于本地的绝对路径。此时代码实现如下所示:
public void uploadTest(){ driver.findElement(By.xpath("//input[@id='load']")).sendKeys("D:\\sk\\test.txt"); }
如果此时我们不单纯的想获取到上传文件的路径,而是想打开本地文件,代码实现如下:
File file = new File("D:/sk/test.txt"); String path = file.getAbsolutePath(); driver.get(path);
1.4Iframe嵌套界面
实例展示如下:
html源码如下:
<tr> <td>Iframe</td> <td class="widgetStyle"> <iframe frameborder="0" width="800" height="330" src="./demo1.html" name="aa"/> </td> </tr>
解决思路就是:我们先从主界面切换到嵌套的界面,即iframe上去,剩下的操作就是我们前面一直进行的定位、操作。为了证明这一点我们采用先在外层界面输入。在切到内层嵌套的jframe输入内容,然后在切出来的方式进行演示。基础代码实现如下:
public void ifameTest(){ //先在外层主界面输入内容 driver.findElement(By.xpath("//input[@id='user']")).sendKeys("hello input"); //实现iframe的切换 driver.switchTo().frame("aa"); //定位到这层的input框输入hello iframe driver.findElement(By.xpath("//input[@id='user']")).sendKeys("hello iframe"); //设置一个等待时间 try { Thread.sleep(10000); } catch (InterruptedException e) { e.printStackTrace(); } //在切回到外层的iframe driver.switchTo().defaultContent(); //清空原来的内容 driver.findElement(By.xpath("//input[@id='user']")).clear(); //再输入新的内容 driver.findElement(By.xpath("//input[@id='user']")).sendKeys("我又回来了"); }
说明【1】切换iframe的方式还有两种:第一种内嵌编号,即默认界面除外,每嵌套一个iframe计为0,以此类推。所以上述切换iframe的代码还可以这样实现:
driver.switchTo().frame(0);
第二种,我们还可以使用xpath定位,直接定位到嵌套的iframe上去,具体实现代码如下:
WebElement ele_iframe = driver.findElement(By.xpath("//iframe[@name='aa']")); driver.switchTo().frame(ele_iframe);
说明【2】必须掌握switchto()方法的用法,这个是跳转iframe必须使用的方法。frame()方法后面可以跟三种类型的参数:int、WebElement和String;
1.5多窗口切换
实现场景:由如下界面直接切换到:百度首页
点击Open后切换到:百度首页
html源码如下:
<td class="widgetStyle"> <div id="open"> <a class="open" target="_bank" href="http://baidu.com">Open new window</a> </div> </td>
实现思路:我们先获取到当前界面跳转的按钮,进而获取到当前窗体的句柄。点击超链接按钮进行窗体的跳转。跳转前driver要先释放掉当前窗体的句柄,从而获取到新窗口的句柄。代码实现如下所示:
public void windowTest(){ //先定位到click WebElement ele_win = driver.findElement(By.xpath("//div[@id='link']/a")); ele_win.click(); //获取到跳转windows窗口的句柄 String stra = driver.getWindowHandle(); System.out.println(stra); driver.switchTo().window(stra); //在百度首页录入hello 百度 WebElement ele_baidu = driver.findElement(By.xpath("//input[@id='kw']")); ele_baidu.sendKeys("hello baidu"); String text = ele_baidu.getText(); System.out.println(text); //老规矩,在新窗体进行输出后跳转回原来的窗体。 driver.navigate().to("file:///F:/selenium_video/demo/demo.html"); driver.findElement(By.xpath("//input[@id='user']")).sendKeys("欢迎回来,主人!"); //driver.switchTo().defaultContent(); }
一般学习自动化学到这里的时候都会告诉我们实现窗口的跳转即 :
//获取到跳转windows窗口的句柄 String stra = driver.getWindowHandle(); System.out.println(stra); driver.switchTo().window(stra);
这三句代码是核心,然而去掉这三句代码,也是可以实现的。具体什么原因 还没哟思考。继续努力吧,前路慢慢~
1.6Wait机制
以前我们使用时间等到机制的时候,使用Thread.sleep(毫秒),但是使用这种方式,会造成时间浪费,比如刷新一个界面只需要3秒,可是我们确把等待时间设置成了10秒。造成了资源等待的浪费,所以我们迫切需要智能等待的机制,此时Wait应运而生。
场景:以下的wait for display是在鼠标点击后5秒后显示出的。
html源码如下:
<div id="wait"> <input class="wait" type="button" onclick="show_div()" value="Wait"/> </div> <div id="display"> <div class="red" style="color: red;">wait for display</div> </div> </td>
java源码实现此功能如下所示:
public void waitTest(){ //先定位点击按钮 WebElement ele_wait = driver.findElement(By.xpath("//input[@class='wait' and @type='button']")); ele_wait.click(); //实现智能等待 WebDriverWait wait = new WebDriverWait(driver, 10); wait.until(new ExpectedCondition<WebElement>() { @Override public WebElement apply(WebDriver driver) { return driver.findElement(By.xpath("//div[@id='display']/div")); } }).isDisplayed(); }
通过上面的代码实现说明如下:
WebDriverWait类的构造方法接受了一个WebDriver对象和一个等待最长时间(10秒)。然后调用until方法,其中重写了ExpectedCondition接口中的apply方法,让其返回一个WebElement,即加载完成的元素。默认情况下,WebDriverWait每500毫秒调用一次ExpectedCondition,直到红色字体成功显示,当然如果超过设定的值还没有成功的返回,将抛出异常。