selenium自动化测试学习5-selenium的常用类介绍

1.Alert和Action类的使用

1.1Alert类

具体样例如下:

selenium自动化测试学习5-selenium的常用类介绍

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类主要是针对鼠标操作所封装的类。应用场景主要是:

selenium自动化测试学习5-selenium的常用类介绍

这种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上传文件操作

 实例:

selenium自动化测试学习5-selenium的常用类介绍

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嵌套界面

实例展示如下:

selenium自动化测试学习5-selenium的常用类介绍

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多窗口切换

实现场景:由如下界面直接切换到:百度首页

selenium自动化测试学习5-selenium的常用类介绍点击Open后切换到:百度首页selenium自动化测试学习5-selenium的常用类介绍

 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秒后显示出的。

selenium自动化测试学习5-selenium的常用类介绍

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,直到红色字体成功显示,当然如果超过设定的值还没有成功的返回,将抛出异常。