【javawb】改变user agent

【改变user agent

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

FirefoxProfile profile = new FirefoxProfile();

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

WebDriver driver = new FirefoxDriver(profile);

 

【等待页面元素加载完】

web的自动化测试中,我们经常会遇到这样一种情况:当我们的程序执行时需要页面某个元素,而此时这个元素还未加载完成,这时我们的程序就会报错。怎么办?等待。等待元素出现后再进行对这个元素的操作。

在selenium-webdriver中我们用两种方式进行等待:明确的等待和隐性的等待。

 

明确的等待

 

明确的等待是指在代码进行下一步操作之前等待某一个条件的发生。最不好的情况是使用Thread.sleep()去设置一段确认的时间去等待。但为 什么说最不好呢?因为一个元素的加载时间有长有短,你在设置sleep的时间之前要自己把握长短,太短容易超时,太长浪费时间。selenium webdriver提供了一些方法帮助我们等待正好需要等待的时间。利用WebDriverWait类和ExpectedCondition接口就能实现这一点。

 

 

下面的html代码实现了这样的一种效果:点击click按钮5秒钟后,页面上会出现一个红色的div块。我们需要写一段自动化脚本去捕获这个出现的div,然后高亮之。

 

 

Html代码

 

Wait.html

 

<html>

    <head>

        <title>Set Timeout</title>

        <style>

            .red_box {background-color: red; width = 20%; height: 100px; border: none;}

        </style>

        <script>

            function show_div(){

                setTimeout("create_div()", 5000);

            }

  

            function create_div(){

                d = document.createElement('div');

                d.className = "red_box";

                document.body.appendChild(d);

            }

        </script>

    </head>

    <body>

        <button id = "b" onclick = "show_div()">click</button>

    </body>

</html>

 

 

下面的代码实现了高亮动态生成的div块的功能:

 

Java代码

 

public class WaitForSomthing {

public static void main(String[] args) {

// TODO Auto-generated method stub

System.setProperty("webdriver.firefox.bin","D:\\Program Files\\Mozilla Firefox\\firefox.exe");  

WebDriver dr = new FirefoxDriver();

String url = "file:///C:/Documents and Settings/gongjf/桌面/selenium_test/Wait.html";// "/Your/Path/to/Wait.html"

dr.get(url);

WebDriverWait wait = new WebDriverWait(dr,10);

wait.until(new ExpectedCondition<WebElement>(){

@Override

public WebElement apply(WebDriver d) {

return d.findElement(By.id("b"));

}}).click();

 

WebElement element = dr.findElement(By.cssSelector(".red_box"));

((JavascriptExecutor)dr).executeScript("arguments[0].style.border = \"5px solid yellow\"",element);  

 

}

}

 

 

上面的代码WebDriverWait类的构造方法接受了一个WebDriver对象和一个等待最长时间(10秒)。然后调用until方法,其中重写了 ExpectedCondition接口中的apply方法,让其返回一个WebElement,即加载完成的元素,然后点击。默认情况下,WebDriverWait每500毫秒调用一次ExpectedCondition,直到有成功的返回,当然如果超过设定的值还没有成功的返回,将抛出异常。

 

附加 显性等待:

WebDriver driver =new FirefoxDriver();

driver.get("http://somedomain/url_that_delays_loading");

WebElement myDynamicElement = (new WebDriverWait(driver, 10))

  .until(new ExpectedCondition<WebElement>(){

  @Override

  public WebElement apply(WebDriver d) {

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

  }});

 

 

 

隐性等待

 

隐性等待是指当要查找元素,而这个元素没有马上出现时,告诉WebDriver查询Dom一定时间。默认值是0,但是设置之后,这个时间将在WebDriver对象实例整个生命周期都起作用。上面的代码就变成了这样:

 

 

Java代码

 

public class WaitForSomthing {

public static void main(String[] args) {

// TODO Auto-generated method stub

System.setProperty("webdriver.firefox.bin","D:\\Program Files\\Mozilla Firefox\\firefox.exe");  

WebDriver dr = new FirefoxDriver();

 

//设置10秒

dr.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);

 

String url = "file:///C:/Documents and Settings/gongjf/桌面/selenium_test/Wait.html";// "/Your/Path/to/Wait.html"

dr.get(url);

                 //注释掉原来的

/*WebDriverWait wait = new WebDriverWait(dr,10);

wait.until(new ExpectedCondition<WebElement>(){

@Override

public WebElement apply(WebDriver d) {

return d.findElement(By.id("b"));

}}).click();*/

dr.findElement(By.id("b")).click();

WebElement element = dr.findElement(By.cssSelector(".red_box"));

((JavascriptExecutor)dr).executeScript("arguments[0].style.border = \"5px solid yellow\"",element);  

 

}

}

 

 

小结:

 

两种方法任选其一

 

 

【截图】

在自动化测试中常常会用到截图功能。可以截取页面全图,不管页面有多长。

 

下面的代码演示了如何使用webdriver进行截图:

 

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

 

Java代码

 

public class ShotScreen {

 

public static void main(String[] args) throws IOException, InterruptedException {

 

System.setProperty("webdriver.firefox.bin","D:\\Program Files\\Mozilla Firefox\\firefox.exe");  

WebDriver dr = new FirefoxDriver();

dr.get("http://www.baidu.com");

 

//这里等待页面加载完成

Thread.sleep(5000);

//下面代码是得到截图并保存在D盘下

File screenShotFile = ((TakesScreenshot)dr).getScreenshotAs(OutputType.FILE);

FileUtils.copyFile(screenShotFile, new File("D:/test.png"));

}

}

【超时设置】

webdriver中可以设置很多的超时时间

  • implicitlyWait。识别对象时的超时时间。过了这个时间如果对象还没找到的话就会抛出NoSuchElement异常
  • setScriptTimeout。异步脚本的超时时间。webdriver可以异步执行脚本,这个是设置异步执行脚本脚本返回结果的超时时间
  • pageLoadTimeout。页面加载时的超时时间。因为webdriver会等页面加载完毕在进行后面的操作,所以如果页面在这个超时时间内没有加载完成,那么webdriver就会抛出异常

代码

# 定位对象时给3s的时间

# 如果3s内还定位不到则抛出异常

driver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);

# 页面加载超时时间设置为5s

dr.manage().timeouts().pageLoadTimeout(5, TimeUnit.SECONDS);

# 异步脚本的超时时间设置成3s

dr.manage().timeouts().setScriptTimeout(3, TimeUnit.SECONDS);

 

 

【封装和重用】

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!”);

 

看,这就简洁多了。

 

类似的封装还有:

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);

    }

 

小结:

 

按照上面的例子你可以对各个方法进行封装,使自己的代码更加简洁!

 

 

【调用selenium1的api

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

// 我用火狐浏览器作为例子

WebDriver driver = new FirefoxDriver(); 

 String baseUrl ="http://www.google.com"; 

Selenium selenium = new WebDriverBackedSelenium(driver, baseUrl);

 

// 执行selenium命令

selenium.open("http://www.google.com");

selenium.type("name=q", "cheese");

selenium.click("name=btnG");

 

WebDriver driverInstance = ((WebDriverBackedSelenium)selenium).getUnderlyingWebDriver();

 

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(manager@ericsson.com);

 

        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","manager@ericsson.com");

        selenium.type("password","manager");

        selenium.click("loginButton");

}

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

py编程

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值