Webdriver API (二)

(转载)

1.3  打开测试页面

对页面对测试,首先要打开被测试页面的地址(如:http://www.google.com),web driver 提供的get方法可以打开一个页面:

// And now use thedriver to visit Google

driver.get("http://www.google.com");

1.4   例子

package org.openqa.selenium.example;

import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.openqa.selenium.support.ui.ExpectedCondition;
import org.openqa.selenium.support.ui.WebDriverWait;

public class Selenium2Example {

        public static voidmain(String[] args) {
        // Create a newinstance of the Firefox driver
        // Notice that theremainder of the code relies on the interface,
        // not the implementation.
        WebDriver driver = newFirefoxDriver();

        // And now use this tovisit Google
       driver.get("http://www.google.com");
        // Alternatively thesame thing can be done like this
        // driver.navigate().to("http://www.google.com");
        // Find the text inputelement by its name
        WebElement element =driver.findElement(By.name("q"));

        // Enter something tosearch for
       element.sendKeys("Cheese!");

        // Now submit the form.WebDriver will find the form for us from the element
        element.submit();

        // Check the title ofthe page
       System.out.println("Page title is: " + driver.getTitle());

        // Google‘s search isrendered dynamically with JavaScript.
        // Wait for the pageto load, timeout after 10 seconds
        (newWebDriverWait(driver, 10)).until(new ExpectedCondition<Boolean>() {
         public Booleanapply(WebDriver d) {
               returnd.getTitle().toLowerCase().startsWith("cheese!");
            }
        });

        // Should see:"cheese! - Google Search"
       System.out.println("Page title is: " + driver.getTitle());

        //Close the browser
        driver.quit();
    }

}

Webdirver对浏览器的支持

2.1   HtmlUnit Driver

优点:HtmlUnit Driver不会实际打开浏览器,运行速度很快。对于用FireFox等浏览器来做测试的自动化测试用例,运行速度通常很慢,HtmlUnit Driver无疑是可以很好地解决这个问题。

缺点:它对JavaScript的支持不够好,当页面上有复杂JavaScript时,经常会捕获不到页面元素。

使用:

WebDriver driver = new HtmlUnitDriver();

2.2   FireFox Driver

优点:FireFox Dirver对页面的自动化测试支持得比较好,很直观地模拟页面的操作,对JavaScript的支持也非常完善,基本上页面上做的所有操作FireFox Driver都可以模拟。

缺点:启动很慢,运行也比较慢,不过,启动之后Webdriver的操作速度虽然不快但还是可以接受的,建议不要频繁启停FireFox Driver。

使用:

WebDriver driver = new FirefoxDriver();

Firefox profile的属性值是可以改变的,比如我们平时使用得非常频繁的改变useragent的功能,可以这样修改:

FirefoxProfile profile = new FirefoxProfile();
profile.setPreference("general.useragent.override", "some UAstring");
WebDriver driver = new FirefoxDriver(profile);

2.3   InternetExplorer Driver

优点:直观地模拟用户的实际操作,对JavaScript提供完善的支持。

缺点:是所有浏览器中运行速度最慢的,并且只能在Windows下运行,对CSS以及XPATH的支持也不够好。

使用:

WebDriver driver = new InternetExplorerDriver();

元素识别及操作

3.1  如何找到页面元素

Webdriver的findElement方法可以用来找到页面的某个元素,最常用的方法是用id和name查找。下面介绍几种比较常用的方法。

3.1.1 By ID

假设页面写成这样:

<input type="text" name="passwd"id="passwd-id" />

那么可以这样找到页面的元素:

通过id查找:

WebElement element = driver.findElement(By.id("passwd-id"));

3.1.2 By Name

或通过name查找:

WebElement element = driver.findElement(By.name("passwd"));

3.1.3 By XPATH

或通过xpath查找:

WebElement element =driver.findElement(By.xpath("//input[@id=‘passwd-id‘]"));

3.1.4 By Class Name

假设页面写成这样:

<div class="cheese"><span>Cheddar</span></div><divclass="cheese"><span>Gouda</span></div>

可以通过这样查找页面元素:

List<WebElement>cheeses = driver.findElements(By.className("cheese"));

3.1.5 By Link Text

假设页面元素写成这样:

<ahref="http://www.google.com/search?q=cheese">cheese</a>>

那么可以通过这样查找:

WebElement cheese =driver.findElement(By.linkText("cheese"));

3.2  如何对页面元素进行操作

找到页面元素后,怎样对页面进行操作呢?我们可以根据不同的类型的元素来进行一一说明。

3.2.1 输入框(text field or textarea)

找到输入框元素:

WebElement element = driver.findElement(By.id("passwd-id"));

在输入框中输入内容:

element.sendKeys(“test”);

将输入框清空:

element.clear();

获取输入框的文本内容:

element.getText();

3.2.2 下拉选择框(Select)

找到下拉选择框的元素:

Select select = new Select(driver.findElement(By.id("select")));

 
  选择对应的选择项:

select.selectByVisibleText(“mediaAgencyA”);

select.selectByValue(“MA_ID_001”);

 

不选择对应的选择项:

select.deselectAll();

select.deselectByValue(“MA_ID_001”);

select.deselectByVisibleText(“mediaAgencyA”);

或者获取选择项的值:

select.getAllSelectedOptions();

select.getFirstSelectedOption();

3.2.3 单选项(Radio Button)

找到单选框元素:

WebElement bookMode =driver.findElement(By.id("BookMode"));

选择某个单选项:

bookMode.click();

清空某个单选项:

bookMode.clear();

判断某个单选项是否已经被选择:

bookMode.isSelected();

3.2.4 多选项(checkbox)

多选项的操作和单选的差不多:

WebElement checkbox =driver.findElement(By.id("myCheckbox."));

checkbox.click();

checkbox.clear();

checkbox.isSelected();

checkbox.isEnabled();

3.2.5 按钮(button)

找到按钮元素:

WebElement saveButton = driver.findElement(By.id("save"));

点击按钮:

saveButton.click();

判断按钮是否enable:

saveButton.isEnabled ();

3.2.6 左右选择框

也就是左边是可供选择项,选择后移动到右边的框中,反之亦然。例如:

Select lang = new Select(driver.findElement(By.id("languages")));

lang.selectByVisibleText(“English”);

WebElement addLanguage =driver.findElement(By.id("addButton"));

addLanguage.click();

3.2.7 弹出对话框(Popup dialogs)

Alert alert = driver.switchTo().alert();

alert.accept();

alert.dismiss();

alert.getText();

3.2.8 表单(Form)

Form中的元素的操作和其它的元素操作一样,对元素操作完成后对表单的提交可以:

WebElement approve = driver.findElement(By.id("approve"));

approve.click();

approve.submit();//只适合于表单的提交

3.2.9 上传文件 (Upload File)

上传文件的元素操作:

WebElement adFileUpload = driver.findElement(By.id("WAP-upload"));

String filePath = "C:\test\\uploadfile\\media_ads\\test.jpg";

adFileUpload.sendKeys(filePath);

3.2.10                 Windows 和 Frames之间的切换

一般来说,登录后建议是先:

driver.switchTo().defaultContent();

切换到某个frame:

driver.switchTo().frame("leftFrame");

从一个frame切换到另一个frame:

driver.switchTo().frame("mainFrame");

切换到某个window:

driver.switchTo().window("windowName");

3.2.11                 拖拉(Drag andDrop)

WebElement element =driver.findElement(By.name("source"));

WebElement target = driver.findElement(By.name("target"));

(new Actions(driver)).dragAndDrop(element, target).perform();

3.2.12                 导航 (Navigationand History)

打开一个新的页面:

driver.navigate().to("http://www.example.com");

通过历史导航返回原页面:

driver.navigate().forward();

driver.navigate().back();

3.3   高级使用

3.3.1 改变user agent

User Agent的设置是平时使用得比较多的操作:

FirefoxProfile profile = new FirefoxProfile();

profile.addAdditionalPreference("general.useragent.override","some UA string");

WebDriver driver = new FirefoxDriver(profile);

3.3.2 读取Cookies

我们经常要对的值进行读取和设置。

增加cookie:

// Now set the cookie. This one‘s valid for the entire domain

Cookie cookie = new Cookie("key", "value");

driver.manage().addCookie(cookie);

获取cookie的值:

// And now output all the available cookies for the current URL

Set<Cookie> allCookies = driver.manage().getCookies();

for (Cookie loadedCookie : allCookies) {

System.out.println(String.format("%s -> %s",loadedCookie.getName(), loadedCookie.getValue()));

}

根据某个cookie的name获取cookie的值:

driver.manage().getCookieNamed("mmsid");

删除cookie:

// You can delete cookies in 3 ways

// By name

driver.manage().deleteCookieNamed("CookieName");

// By Cookie

driver.manage().deleteCookie(loadedCookie);

// Or all of them

driver.manage().deleteAllCookies();

3.3.3 调用Java Script

Web driver对Java Script的调用是通过JavascriptExecutor来实现的,例如:

JavascriptExecutor js = (JavascriptExecutor) driver;

js.executeScript("(function(){inventoryGridMgr.setTableFieldValue(‘"+ inventoryId + "‘,‘" + fieldName + "‘,‘"

+ value + "‘);})()");

3.3.4 Webdriver截图

如果用webdriver截图是:

driver = webdriver.Firefox()
driver.save_screenshot("C:\error.jpg")

3.3.5 页面等待

因为Load页面需要一段时间,如果页面还没加载完就查找元素,必然是查找不到的。最好的方式,就是设置一个默认等待时间,在查找页面元素的时候如果找不到就等待一段时间再找,直到超时。

Webdriver提供两种方法,一种是显性等待,另一种是隐性等待。

显性等待:

WebDriver driver =new FirefoxDriver();
driver.get("http://somedomain/url_that_delays_loading");
WebElementmyDynamicElement = (new WebDriverWait(driver, 10))
  .until(newExpectedCondition<WebElement>(){
  @Override
  public WebElementapply(WebDriver d) {

    returnd.findElement(By.id("myDynamicElement"));

  }});

隐性等待:

WebDriver driver = new FirefoxDriver();
driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
driver.get("http://somedomain/url_that_delays_loading");
WebElement myDynamicElement =driver.findElement(By.id("myDynamicElement"));

RemoteWebDriver

当本机上没有浏览器,需要远程调用浏览器进行自动化测试时,需要用到RemoteWebDirver.

4.1   使用RemoteWebDriver

import java.io.File;
import java.net.URL;
import org.openqa.selenium.OutputType;
import org.openqa.selenium.TakesScreenshot;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.remote.Augmenter;
import org.openqa.selenium.remote.DesiredCapabilities;
import org.openqa.selenium.remote.RemoteWebDriver;

public class Testing {

     public void myTest()throws Exception {
        WebDriver driver = newRemoteWebDriver(
                               new URL("http://localhost:4446/wd/hub"),
                               DesiredCapabilities.firefox());

       driver.get("http://www.google.com");       

        // RemoteWebDriverdoes not implement the TakesScreenshot class
        // if the driver doeshave the Capabilities to take a screenshot
        // then Augmenter willadd the TakesScreenshot methods to the instance
        WebDriveraugmentedDriver = new Augmenter().augment(driver);
        File screenshot =((TakesScreenshot)augmentedDriver).
                            getScreenshotAs(OutputType.FILE);

    }

}

4.2   SeleniumServer

在使用RemoteDriver时,必须在远程服务器启动一个SeleniumServer:

java -jar selenium-server-standalone-2.20.0.jar -port 4446

4.3   How to setFirefox profile using RemoteWebDriver

profile = new FirefoxProfile();
profile.setPreference("general.useragent.override",testData.getUserAgent());
capabilities = DesiredCapabilities.firefox();
capabilities.setCapability("firefox_profile", profile);

driver = new RemoteWebDriver(new URL(“http://localhost:4446/wd/hub”),capabilities);
driverWait = new WebDriverWait(driver,TestConstant.WAIT_ELEMENT_TO_LOAD);
driver.get("http://www.google.com");

封装与重用

WebDriver对页面的操作,需要找到一个WebElement,然后再对其进行操作,比较繁琐:

// Find the text inputelement by its name

WebElement element = driver.findElement(By.name("q"));

// Enter something to search for

element.sendKeys("Cheese!");

我们可以考虑对这些基本的操作进行一个封装,简化操作。比如,封装代码:

protected void sendKeys(Byby, String value){

driver.findElement(by).sendKeys(value);

}

那么,在测试用例可以这样简化调用:

sendKeys(By.name("q"),”Cheese!”);

看,这就简洁多了。

类似的封装还有:

package com.drutt.mm.end2end.actions;

import java.util.List;
import java.util.NoSuchElementException;
import java.util.concurrent.TimeUnit;
import org.openqa.selenium.By;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.remote.RemoteWebDriver;
import org.openqa.selenium.support.ui.WebDriverWait;
import com.drutt.mm.end2end.data.TestConstant;

public class WebDriverAction {

   //protected WebDriverdriver;
   protected RemoteWebDriverdriver;
   protected WebDriverWaitdriverWait;

    protected booleanisWebElementExist(By selector) {
        try {
            driver.findElement(selector);
            return true;
        } catch(NoSuchElementException e) {
            return false;
        }

    }

    protected StringgetWebText(By by) {
        try {
        return driver.findElement(by).getText();
        } catch (NoSuchElementException e) {
            return "Textnot existed!";
        }

    }

    protected voidclickElementContainingText(By by, String text){
        List<WebElement>elementList = driver.findElements(by);
        for(WebElement e:elementList){
            if(e.getText().contains(text)){
                e.click();
                break;
           }

        }    

    }

    protected StringgetLinkUrlContainingText(By by, String text){
        List<WebElement>subscribeButton = driver.findElements(by);
        String url = null;
        for(WebElement e:subscribeButton){
            if(e.getText().contains(text)){
                url =e.getAttribute("href");
                break;
            }

        }
        return url;
    }

    protected void click(Byby){
       driver.findElement(by).click();
       driver.manage().timeouts().implicitlyWait(TestConstant.WAIT_ELEMENT_TO_LOAD,TimeUnit.SECONDS);

    }

    protected StringgetLinkUrl(By by){

        return driver.findElement(by).getAttribute("href");

    }

    protected void sendKeys(Byby, String value){

       driver.findElement(by).sendKeys(value);

    }

 }

在selenium2.0中使用selenium1.0的API

Selenium2.0中使用WeDriver API对页面进行操作,它最大的优点是不需要安装一个selenium
server就可以运行,但是对页面进行操作不如selenium1.0的Selenium RC
API那么方便。Selenium2.0提供了使用Selenium RC API的方法:

// You may use any WebDriver implementation. Firefox is used hereas an example
WebDriver driver = new FirefoxDriver();

// A "base url", used by selenium to resolve relativeURLs
 String baseUrl ="http://www.google.com";

// Create the Selenium implementation
Selenium selenium = new WebDriverBackedSelenium(driver, baseUrl);

// Perform actions with selenium
selenium.open("http://www.google.com");
selenium.type("name=q", "cheese");
selenium.click("name=btnG");

// Get the underlying WebDriver implementation back. This willrefer to the
// same WebDriver instance as the "driver" variableabove.
WebDriver driverInstance = ((WebDriverBackedSelenium)selenium).getUnderlyingWebDriver();
    //Finally, close thebrowser. Call stop on the WebDriverBackedSelenium instance
    //instead of callingdriver.quit(). Otherwise, the JVM will continue running after
    //the browser has beenclosed.
    selenium.stop();

我分别使用WebDriver API和SeleniumRC API写了一个Login的脚本,很明显,后者的操作更加简单明了。

WebDriver API写的Login脚本:

  public void login() {
        driver.switchTo().defaultContent();
        driver.switchTo().frame("mainFrame");

        WebElement eUsername= waitFindElement(By.id("username"));
        eUsername.sendKeys([email protected]);

        WebElement ePassword= waitFindElement(By.id("password"));
        ePassword.sendKeys(manager);

        WebElementeLoginButton = waitFindElement(By.id("loginButton"));
       eLoginButton.click();

    }

SeleniumRC API写的Login脚本:

public void login() {

        selenium.selectFrame("relative=top");
        selenium.selectFrame("mainFrame");
        selenium.type("username","[email protected]");
        selenium.type("password","manager");
        selenium.click("loginButton");
}
时间: 2024-12-19 04:47:31

Webdriver API (二)的相关文章

Selenium2+Python:Webdriver API速记手册

由于web自动化常常需要控制浏览器行为和操作页面元素,相关函数又比较多,于是再此记下一份Webdriver API查阅文档以备不时之需. 参考:虫师<Selenium2自动化测试实战>,和http://selenium-python.readthedocs.io/api.html 1 #coding=utf-8 2 from selenium import webdriver 3 driver=webdriver.Firefox() 4 driver.get('http://www.baidu

selenium之WebDriver API

自动化只要掌握四步操作:获取元素,操作元素,获取返回结果,断言(返回结果与期望结果是否一致),最后自动出测试报告,元素定位在这四个环节中是至关重要的,如果说按学习精力分配的话,元素定位占70%:操作元素10%,获取返回结果10%:断言10%.如果一个页面上的元素不能被定位到,那后面的操作就无法继续了.而WebDriver 属于Selenium体系设计出来操作浏览器的一套API,它支持多种语言,Selenium WebDriver只是python的一个第三方框架,也就是说是一个实现web自动化的第

Civil 3D API二次开发学习指南

Civil 3D构建于AutoCAD 和 Map 3D之上,在学习Civil 3D API二次开发之前,您至少需要了解AutoCAD API的二次开发,你可以参考AutoCAD .NET API二次开发学习指南.另外,如果你用到Map 3D相关的功能,你还可能需要Map 3D的开发知识,看Map 3D API二次开发学习指南. 软件准备及开发环境 AutoCAD Civil 3D 软件,推荐2014以上版本,你可以从Autodesk 官方网站下载试用版, Visual Studio 2012 或

webdriver API中文文档

1.1   下载selenium2.0的lib包 http://code.google.com/p/selenium/downloads/list 官方UserGuide:http://seleniumhq.org/docs/ 1.2   用webdriver打开一个浏览器 我们常用的浏览器有firefox和IE两种,firefox是selenium支持得比较成熟的浏览器.但是做页面的测试,速度通常很慢,严重影 响持续集成的速度,这个时候建议使用HtmlUnit,不过HtmlUnitDirver

常用API二

常用API二一.Object 成员方法: 1.toString(): 重写前,调用object类中的,打印的是全类名@16进制的地址值 . 重写后打印具体对象的值 2.equals():重写前比较的是地址值 重写后打印的是具体属性值 3.获取字节码对象3种方式(三个获取的值相等) A:通过Object类中getClass()方法调用,Teacher t = new Teacher();t.getclass(); B:类名点调用 Teacher.class(); C:通过Class类的静态方法fo

虫师Selenium2+Python_4、webdriver API

大纲 P70——WebDriver API P83——控制浏览器 P86——简单元素操作 P92——键盘事件和获得验证信息(预期结果) P95——设置元素等待:显示等待和隐式等待 P100——定位一组元素 P104——多表单切换 P106——多窗口切换 P108——警告框处理 P110——上传文件 P116——下载文件 P117——操作cookie P120——调用JavaScript P123——处理HTML5的视频播放 P124——窗口截图 P125——关闭窗口和验证码处理 P128——We

java+selenium3-常用的WebDriver API

常用的WebDriver API 访问某网站 package com.wb.api; import org.openqa.selenium.WebDriver; import org.openqa.selenium.chrome.ChromeDriver; public class WebDriverTest { public static void main(String[] args) { WebDriver driver; // 设置浏览器驱动环境变量 System.setProperty

k8s python api二次封装 例子

k8s python api二次封装 pip install pprint kubernetes import urllib3 from pprint import pprint from kubernetes import client from os import path import yaml class K8sApi(object): def __init__(self): # self.config = config.kube_config.load_kube_config() ur

第 4 章 WebDriver API

从本章开始正式学习 WebDriver API,它可用来操作浏览器元素的一些类和方法. 4.1 从定位元素开始 例如百度的首页,页面上有输入框.按钮.文字链接.图片等元素.自动化测试要做的就是模拟鼠标和键盘来操作这些元素,如单击.输入.鼠标悬停等.而操作这些元素的前提是要定位它们.自动化工具,如何定位这些元素呢?通过浏览器自带的(F12)开发者工具可以看到,页面元素都是由 HTML 代码组成的,它们之间有层级地组织起来,每个元素有不同的标签名和属性值.WebDriver 就是根据这些信息来定位元