• Selenium Page object Pattern usage


    使用Selenium的framework,大家免不了要使用他的page object pattern来开发适合自己的framework,原因很简单,page object 可以将测试的对象抽象成一个个的class 类,每个页面对应一个page的class。这个有点类似于QTP的对象库,所以使用它的好处显而易见。一个好的framework是可以节省很多的coding的。所以你在使用page object的时候可以先写一个基础的page object的类,然后其他的任何的page都继承这个类,这样的好处就是符合面向对象编程的多态的特性,而且在其他的page对象中很容易引用基础类中的method,这样你可以整合你的所有的可重用的method在基础类中。使用起来引用即可;

    这里截取一个自己开发的base的page object类,其他的page object 只需要继承这个类即可,使用起来相当的方便。

    /**
     * Project Name:
     * File Name:PageBase.java
     * Package Name:com.hp.pop
     * Date:Sep 13, 20131:06:16 PM
     * Copyright (c) 2013, alterhu2020@gmail.com All Rights Reserved.
     *
    */
    
    package com.test.pop;
    
    
    import java.awt.AWTException;
    import java.awt.Robot;
    import java.io.BufferedReader;
    import java.io.BufferedWriter;
    import java.io.File;
    import java.io.FileReader;
    import java.io.FileWriter;
    import java.io.IOException;
    import java.util.List;
    import java.util.Set;
    
    import org.apache.log4j.Logger;
    import org.junit.Assert;
    import org.openqa.selenium.Alert;
    import org.openqa.selenium.By;
    import org.openqa.selenium.JavascriptExecutor;
    import org.openqa.selenium.Keys;
    import org.openqa.selenium.NoAlertPresentException;
    import org.openqa.selenium.NoSuchElementException;
    import org.openqa.selenium.TimeoutException;
    import org.openqa.selenium.WebDriver;
    import org.openqa.selenium.WebElement;
    import org.openqa.selenium.interactions.Actions;
    import org.openqa.selenium.support.ui.ExpectedCondition;
    import org.openqa.selenium.support.ui.ExpectedConditions;
    import org.openqa.selenium.support.ui.Select;
    import org.openqa.selenium.support.ui.WebDriverWait;
    
    import com.google.common.base.Strings;
    import com.test.utility.FilesUtils;
    import com.test.utility.SeleniumCore;
    
    
    /**
     * ClassName:PageBase 
     * Function: TODO ADD FUNCTION. 
     * Reason:     TODO ADD REASON. 
     * Date:     Sep 13, 2013 1:06:16 PM 
     * @author   huchan
     * @version  
     * @since    JDK 1.6
     * @see       http://chon.techliminal.com/page_object/#/slide4
     * @see       https://github.com/ChonC/wtbox/blob/master/src/wtbox/pages/PageBase.java
     */
    /**
     * @author huchan
     *
     */
    public abstract class PageObject {
    
        public final WebDriver driver; // this is the webdriver instance
        public static Logger logger=Logger.getLogger(PageObject.class);  // this is the log4j instance
        
        /*
         * the blow is for the test data we will generate in the email report
         */
        public  static String status;  //this is the static step status we need 
        public  static String comments;  //this is the comment generate for this step
        //the blow is the data we need to populate in our email for the data used 
        public static String comment_executionstart=null;
        public static String comment_login_credential=null;
        public static String comment_paf_buildnumber=null;
        public static String comment_paf_url=null;
        
        public PageObject(WebDriver driver){
            this.driver=driver;
        }
        
        /**
         * this is the first method we must use in every page ,so that we can get the page loading time 
         * @param pagename
         * @throws IOException 
         * @throws Exception
         */
        public void verifyPageElements(String pagename) throws IOException{
        //    this is a line seperator so that we can see the debug log clearly
            logger.info("
    "+Strings.repeat("*", 20)+pagename+Strings.repeat("*", 20));
            //get the page loading time  in every page if we use this method
            long pageloadingtime=getPageLoadTime();
            generatePageLoadTime(pagename, pageloadingtime);            
        }
        
        /** Is the text present in page. */ 
        public  boolean isTextPresent(String text){
              boolean textpresent=driver.getPageSource().contains(text); 
              logger.info("Verify the element text present in the page,the text seacrh is :"+text+",and found the element status is:"+textpresent);
              return textpresent;
        }
    
        /** Is the Element in page. */
        public boolean isElementPresent(By by) {
                try {
                    driver.findElement(by);//if it does not find the element throw NoSuchElementException, thus returns false. 
                    return true;
                } catch (NoSuchElementException e) {
                    return false;
                }
         }
    
          /**
            * Checks if the elment is in the DOM and displayed. 
            * 
            * @param by - selector to find the element
            * @return true or false
            */
          public boolean isElementPresentAndDisplay(WebElement e) {
              boolean isdisplay=false;
                try {            
                    isdisplay=e.isDisplayed(); 
                    logger.info("Verify current element is displayed in the page :"+isdisplay);
                } catch (NoSuchElementException error) {
                    logger.info("Sorry,this element not displayed in the page,throw:"+error.getMessage());
                }
                return isdisplay;
          }
    
          /** 
           * Returns the first WebElement using the given method.         
           * It shortens "driver.findElement(By)". 
           * @param by         element locater. 
           * @return         the first WebElement
           */
          public WebElement getWebElement(By by){
                  return driver.findElement(by);             
          }
          
          
          /**
             * clear the text in the elment and then type the new string in this element
             * @param e -- the webelment you need to type 
             * @param text -- the text you want to input
             * @author huchan
             */
            public void clearAndTypeString(WebElement e, String text) {
                logger.info("Type a text into the element is:" + e.getTagName()
                        + ", the inputted text:" + text);
                //e.sendKeys(Keys.DELETE);
                //String code=getInnerHtmlCode(driver, e);
            //    logger.info("Clicked element html code is:"+code);
                highLight(e);
                e.clear();
                e.sendKeys(text);
                //e.sendKeys(Keys.TAB);
    
            }
                    
            /**
             * highLight:(highlight the web element in the page). 
             * 
    
             * @author huchan
             * @param driver -- the web driver instance 
             * @param e -- the web element object
             * @since JDK 1.6
             */
            public  void highLightExt(WebDriver driver, WebElement e) {
                logger.info("Highlight the element ,the object is:" + e.getTagName()
                        + ",the text in this object is:" + e.getText());
                Actions action = new Actions(driver);
                action.contextClick(e).perform();
                logger.info("Had right click the object ,then press the escape key");
                e.sendKeys(Keys.ESCAPE);
            }
            public void highLight(WebElement e) {
                if (driver instanceof JavascriptExecutor) {
                    executeJS("arguments[0].style.border='3px solid red'",e);
                }
            }
            
            /**
             * executeJS:(execute the java script in this page). 
    
             * @author huchan
             * @param driver -- the web driver's instance
             * @param script  --the java script we need to execute
             * @since JDK 1.6
             */
            public Object executeJS(String script) {
                logger.info("Run the javascript from page ,the java script is:"
                        + script);
                JavascriptExecutor je = (JavascriptExecutor) driver;
                return je.executeScript(script);
    
            }
            public void executeJS(String script,WebElement e) {
                logger.info("Run the javascript from page ,the java script is:"
                        + script);
                //highLight(e);
                JavascriptExecutor je = (JavascriptExecutor) driver;
                je.executeScript(script,e);
    
            }
            public Object executeJSReturn(String script,WebElement e) {
                logger.info("Run the javascript from page ,the java script is:"
                        + script);
                //highLight(e);
                JavascriptExecutor je = (JavascriptExecutor) driver;
                Object object=je.executeScript(script,e);
                return object;
    
            }
            public Object executeJSReturn(String script) {
                logger.info("Run the javascript from page ,the java script is:"
                        + script);
                JavascriptExecutor je = (JavascriptExecutor) driver;
                Object object=je.executeScript(script);
                return object;
            }
            
            
    
            /**
             * click an element in the page 
             * @param driver TODO
             * @param e --the WebElment we need to click
             * @author huchan
             */
            public void clickElement(WebElement e) {
                logger.info("Click elements in page-clicked this element:"
                        + e.getTagName() + ",the text is:" + e.getText());
                //In chrome browser this function didn't work ,so give a solution to load the page correctly
            //    ((JavascriptExecutor) driver).executeScript("window.scrollTo(0,"+e.getLocation().y+")");
                //String code=getInnerHtmlCode(driver, e);
                //logger.info("Clicked element html code is:"+code);
                highLight(e);
                e.click();
            }
            
            /**
             * click an element in the page 
             * @param e --the WebElment we need to click
             * @author huchan
             */
            public void clickElementViaJs(WebElement e) {
                logger.info("Click elements in page-clicked this element:"
                        + e.getTagName() + ",the text is:" + e.getText());
                //In chrome browser this function didn't work ,so give a solution to load the page correctly
                highLight(e);
                executeJS("arguments[0].click();", e); 
            
            }
            /**
             * click an element in the page 
             * @param e --the WebElment we need to click
             * @author huchan
             */
            public void clickElementViaJsID(String elementid) {
                  logger.info("Click elements in page-clicked this element html id is"+elementid);
                //In chrome browser this function didn't work ,so give a solution to load the page correctly
                  //highLight(e);
                  executeJS("document.getElementById('"+elementid+"').click();");
                  logger.info("Clicked element's html ID is:"+elementid);    
            }
            
            /**
             * click an element in the page 
             * @param e --the WebElment we need to click
             * @author huchan
             */
            public void clickElementViaMouse(WebElement e) {
                logger.info("Click elements in page-clicked this element:"
                        + e.getTagName() + ",the text is:" + e.getText());
                //In chrome browser this function didn't work ,so give a solution to load the page correctly
            //    ((JavascriptExecutor) driver).executeScript("window.scrollTo(0,"+e.getLocation().y+")");
                highLight(e);
                new Actions(driver).moveToElement(e).clickAndHold().release().build().perform();
                 //"return arguments[0].fireEvent('onclick');",
                // String code=getInnerHtmlCode(driver, e);
                // logger.info("Clicked element html code is:"+code);
                
            }
            /**
             * right click an element in the page 
             * @param e --the WebElment we need to click
             * @author huchan
             */
            public void rightClickElement(WebElement e) {
                logger.info("Right Click elements in page-clicked this element:"
                        + e.getTagName() + ",the text is:" + e.getText());
                //In chrome browser this function didn't work ,so give a solution to load the page correctly
            //    ((JavascriptExecutor) driver).executeScript("window.scrollTo(0,"+e.getLocation().y+")");
                highLight(e);
                new Actions(driver).contextClick(e).perform();
                 //"return arguments[0].fireEvent('onclick');",
                // String code=getInnerHtmlCode(driver, e);
                //logger.info("Right Clicked element html code is:"+code);
                
            }
            
            /**
             * send key to an element
             * @param e --the webelement you want to send the key
             * @param enter -- the key need to send 
             * @author huchan
             */
            public void sendKeys(WebElement e, String enter) {
                logger.info("Send keys in this element:" + e.getTagName()
                        + ",the key we send is:" + enter);
            //    e.clear();
                highLight(e);
                e.sendKeys(enter);
            }
    
            /**
             * @param testedURL
             * @throws Exception 
             */
            public void open(String testedURL) throws Exception {
                // TODO Auto-generated method stub
                //Date:Sep 26, 20139:14:57 AM
                driver.get(testedURL);
            }
    
    
    
            /**
             * select an option from the drop list, depends on the visible text
             * @param e --the web element object
             * @param text -- the visible text from the dropdown list
             * @author huchan
             */
            public void selectElementViaText(WebElement e, String text) {
                logger.info("Select option text from the list ,list element is:"
                        + e.getTagName() + ",the option text is:" + text);
                highLight(e);
                Select select = new Select(e);
                select.selectByVisibleText(text);
            }
    
            /**
             * select an option from the drop list, depends on the tag's attribute value
             * @param e  --the web element object
             * @param value -- the value attribute for this element
             * @author huchan
             */
            public void SelectElementViaValue(WebElement e, String value) {
                logger.info("Select option value from the list ,list element is:"
                        + e.getTagName() + ",the option value is:" + value);
                highLight(e);
                Select select = new Select(e);
                select.selectByValue(value);
            }
    
            /**
             * select an option from the drop list, depends on the index ,the index begin with 0
             * @param e  --the web element object
             * @param index -- the index of this webelement ,begin with 0
             * @author huchan
             */
            public void SelectElementViaIndex(WebElement e, int index) {
                logger.info("Select option index from the list ,list element is:"
                        + e.getTagName() + ",the option index is:" + index);
                highLight(e);
                Select select = new Select(e);
                select.selectByIndex(index);
            }
    
            
    
    
            /**
             * wait for an object to be dislayed in the page
             * @param e -- the web element object
             * @return  true: the object displayed ,
             *          false:the object not displayed in the page ;
             * @author huchan
             * @throws Exception 
             */
            public boolean waitProcessBarNotAppear(WebElement e){
                int waitcount = 0;
                boolean isDisplayed = false;
                while (e.isDisplayed()) {
                    waitcount = waitcount + 1;
                    isDisplayed = e.isDisplayed();
                    logger.info("Waitting for the object displayed status-the load object displayed status is:"
                            + isDisplayed);
                    sleepSeconds(3);
                    if (waitcount == 5) {
                        logger.error("Waitting for the object displayed status-the object cannot show in the page:"
                                + e.getTagName() + ",exit the identify the object ");
                        break;
                    }
    
                }
                return isDisplayed;
    
            }
            
            /**
             * wait for the object displayed in the page ,the time out will be 120 seconds ,if it still not show ,it will failed
             * @param driver
             * @param xpathExpression
             * @return
             */
            public boolean waitForObjectDisplay(final String xpathExpression){
                boolean findobject=false;
                WebDriverWait wait=new WebDriverWait(driver, 120);
                try{
                wait.until(new ExpectedCondition<Boolean>() {
    
                        @Override
                        public Boolean apply(WebDriver driver) {
                            logger.info("Enter the waitForObjectDisplay method to wait for the object displayed in the page ");
                            return (driver.findElement(By.xpath(xpathExpression)).isDisplayed());
                        }
                });
                findobject=true;
                }
                catch(TimeoutException te){
                    logger.info("throw expection ,cannot find the web element:"+te.getMessage());
                    logger.info("the time out is 120 ,we cannot find this webelment:"+xpathExpression);
                    Assert.fail("Cannot find this web element in the page:"+xpathExpression);
                }
                
                return findobject;
            }
            
        
            /**
             * execute the script to set the datepicker value
             * @param driver --the webdriver instance
             * @param elementid -- the web element's id
             * @param date   --the date we need to set ,it's string
             * @author huchan
             */
            public void setDateTimePicker(String elementid,
                    String date) {
                logger.info("Set DatePicker Date or Time --Execute the java script to modify the weblement's attribute:value,the element id is:"
                        + elementid);
                
                executeJS("window.document.getElementById('" + elementid
                        + "').setAttribute('value', '" + date + "');");
    
            }
    
            /**
             * select the checkbox ,if it selectd ,we will not select it again
             * @param e -- the web element object
             * @author huchan
             */
            public void checkboxed(WebElement e) {
                highLight(e);
                if (!(e.isSelected())) {
                    logger.info("Check the checkbox,the webelment :" + e.getTagName()
                            + e.getText() + ",had been selected now");
                    e.click();
                } else {
                    logger.info("Check the checkbox,the webelment :" + e.getTagName()
                            + e.getText() + ",had been selected default");
                }
            }
    
            /**
             * get the text in the web element
             * @param e  -- the web element object
             * @return  String -- the web element's text
             * @author huchan
             */
            public String getElementText(WebElement e) {
                logger.info("Get the element text.The webelement is:" + e.getTagName()
                        + ",the text in the webelement is:" + e.getText().trim());
                highLight(e);
                return e.getText().trim();
            }
    
            /**
             * verify the object is enabled in the page
             * @param e  -- the web element object
             * @return  true :the object is enabled ,false:the object is disabled
             * @author huchan
             */
            public boolean isEnabled(WebElement e) {
                logger.info("Verify webelement Enabled in the page-the current webelement is:"
                        + e.getTagName()
                        + ",the text in the webelement is:"
                        + e.getText().trim());
                highLight(e);
                return e.isEnabled();
            }
    
            /**
             * verify the object is selected in the page
             * @param e --the web element object
             * @return  true:the object is selected,false:the object is not selected
             * @author huchan
             */
            public boolean isSelected(WebElement e) {
                logger.info("Verify webelement Selected in the page-the current webelement is:"
                        + e.getTagName()
                        + ",the text in the webelement is:"
                        + e.getText().trim());
                highLight(e);
                return e.isSelected();
    
            }
    
            /**
             * get the webelement's attribute value
             * @param e  --the web element object
             * @param attributename  -- the web element's attribute
             * @return String-- the attribute value for this web element
             * @author huchan
             */
            public String getAttribute(WebElement e, String attributename) {
                logger.info("Get the webelement Attribute-the webelement's attribute:"
                        + e.getTagName() + ",the text in the webelement is:"
                        + e.getText().trim());
                String attributevalue = e.getAttribute(attributename);
                logger.info("Get the webelement Attribute-the webelement's attribute:"
                        + attributename + " value is:" + attributevalue);
                return attributevalue;
            }
    
            /**
             * get the web element's tag name 
             * @param e -- the web element object
             * @return  String --the web element's tag name
             * @author huchan
             */
            public String getTagName(WebElement e) {
                logger.info("Get the webelement TagName-the webelement's tag name is:"
                        + e.getTagName() + ",the text in the webelement is:"
                        + e.getText().trim());
                highLight(e);
                String tagname = e.getTagName();
                logger.info("Get the webelement TagName-the webelement's tag name is:"
                        + e.getTagName());
                return tagname;
            }
    
            /**
             * get all the web elements behind the specified element
             * @param e -- the web element object
             * @param tagname  -- the web element's tag name
             * @return  List<WebElement> a list of all the sub web element we found
             * @author huchan
             */
            public List<WebElement> findElementListByTagName(WebElement e,
                    String tagname) {
                logger.info("Find all subelements by Tag Name:" + e.getTagName()
                        + ",the sub elment's tag name is:" + tagname);
                highLight(e);
                List<WebElement> elements = e.findElements(By.tagName(tagname));
                return elements;
            }
    
            /**
             * find the element by xpath in the page
             * @param e --the web element object
             * @param xpath -- the web element's xpath
             * @return  WebElement -- get the found web element
             */
            public WebElement findElementByXpath(WebElement e, String xpath) {
                logger.info("Find subelement by Xpath-we will find an sub element with the xpath:"
                        + xpath);
                highLight(e);
                WebElement element = e.findElement(By.xpath(xpath));
                //highLight(driver, element);
                return element;
            }
            /**
             * find the element by xpath in the page
             * @param e --the web element object
             * @param xpath -- the web element's xpath
             * @return  WebElement -- get the found web element
             */
            public WebElement findElementByCSS(WebElement e, String css) {
                logger.info("Find subelement by css-we will find an sub element with the css selector:"
                        + css);
                highLight(e);
                WebElement element = e.findElement(By.cssSelector(css));
                //highLight(driver, element);
                return element;
            }
            /**
             * click the ok button in the pop up dialog (alert dialog)
             * @param driver  -- the web driver's instance
             * @param seconds -- the seconds we need to wait to click it
             * @author huchan
             */
            public boolean alertClickOK(int seconds) {
                boolean isclicked=false;
                WebDriverWait wait=new WebDriverWait(driver, seconds);
                try{
                Alert alert=wait.until(ExpectedConditions.alertIsPresent());
                logger.info("Pop up Alert text is:"+alert.getText());
                alert.accept();
                isclicked=true;
                }catch(NoAlertPresentException e){
                    logger.info("the Alert didn't pop up currently:"+e.getMessage());
                }catch(TimeoutException e){
                    logger.error("Time out we cannot find this OK button:"+seconds);
                }
                
                return isclicked;
                // driver.w
            }
            
            /**
             * this fuction is used for clicking the cancel button
             * @category click the Alert dialog ,click the cancel button
             * @param driver -- the web driver instance
             * @param seconds -- the second we need to wait to click the cancel button
             * @see alertClickOK
             * @author huchan
             */
    
            public boolean alertClickCancel(int seconds) {
                boolean isclicked=false;
                WebDriverWait wait=new WebDriverWait(driver, seconds);
                try{
                Alert alert=wait.until(ExpectedConditions.alertIsPresent());
                logger.info("Pop up Alert text is:"+alert.getText());
                alert.dismiss();
                isclicked=true;
                }catch(NoAlertPresentException e){
                    logger.info("the alert didn't pop up currently:"+e.getMessage());
                }
                catch(TimeoutException e){
                    logger.error("Time out we cannot find this Cancel button:"+seconds);
                }
                
                return isclicked;
            }
            
            
        
            /**
             * getCurrentURL:(get the current page URL address). 
    
             * @author huchan
             * @param driver  --- the web driver instance
             * @return String ---the url of current page
             * @since JDK 1.6
             */
            public String getCurrentPageURL(){
                String pageurl="";
                JavascriptExecutor je=(JavascriptExecutor) driver;
                final String docstate=(String) je.executeScript("return document.readyState");
                logger.info("Current loading page state is:"+docstate);
                WebDriverWait wait=new WebDriverWait(driver,120);
                ExpectedCondition<Boolean> ec = new ExpectedCondition<Boolean>() {
                      @Override
                    public Boolean apply(WebDriver d) {
                        return (docstate.equals("complete"));
                      }
                    };
                try{
                   logger.info("We just wait for the current page load correctly now...");
                   wait.until(ec);           
                   pageurl=driver.getCurrentUrl();
                   logger.info("we found the current url is:"+pageurl);
                }
                catch(TimeoutException e){
                    pageurl="time out:120 seconds";
                    logger.error("Sorry the page cannot be loaded correctly:"+e.getMessage()+driver.getCurrentUrl());
                }
                return pageurl;
            }
            
            /**
             * wait for the web page to full loading correctly ,it will wait for 3 minutes to load the page ,
             * if the page not loading in 3 minutes ;it will throw error;
             * @param driver
             */
            public boolean waitForBrowserFullSync(){
                final String currentbowserstate=(String)executeJS("return document.readyState;");
                logger.info("Current browser state is:"+currentbowserstate);
                WebDriverWait wdw=new WebDriverWait(driver, 180);
                ExpectedCondition<Boolean> ec=new ExpectedCondition<Boolean>() {
                    @Override
                    public Boolean apply(WebDriver driver) {
                        // TODO Auto-generated method stub
                        String newpagestate=(String) executeJS("return document.readyState;");
                        logger.debug("the new page state is:"+newpagestate);
                        return (newpagestate.equals("complete"));
                    }
                };
                
                boolean loaded=wdw.until(ec);
                logger.debug("finally the load is loading with completed status is:"+loaded);
                return loaded;
            }
            
            //***********************************************************************************************************
            /**
             * switchtoWindow:(Here describle the usage of this function). 
             * http://santoshsarmajv.blogspot.com/2012/04/how-to-switch-control-to-pop-up-window.html
             * http://stackoverflow.com/questions/11614188/switch-between-two-browser-windows-using-selenium-webdriver
             *
             * @author huchan
             * @param driver
             * @param windowTitle
             * @throws AWTException 
             * @since JDK 1.6
             */
            public void switchtoWindow(String windowTitle) throws AWTException{
                Robot robot=new Robot();
                Set<String> allwindows=driver.getWindowHandles();
                for (String window : allwindows) {
                    driver.switchTo().window(window);
                    if (driver.getTitle().contains(windowTitle)) {
                       robot.delay(5000);
                      // robot.keyPress(keycode);
                    }
                }
            }
            
            /**
             * refresh the current page
             * @param driver
             */
            public void refreshPage(){
                //driver.navigate().refresh();
                logger.info("Now refresh the page to keep the session valid");
                //or blow
                Actions actions = new Actions(driver);
                actions.sendKeys(Keys.F5).perform();
            }
            /**
             * get the page title
             * @param driver
             * @return String
             */
            public String getPageTitle(){
                String title=driver.getTitle();
                logger.info("Get current page title is:"+title);
                return title;
            }
            
            /**
             * get the webelement's html code
             * @param driver
             * @param e
             * @return String
             */
            public String getInnerHtmlCode(WebElement e){
                String contents = (String)executeJSReturn("return arguments[0].innerHTML;", e);
                logger.info("Get the html code for this webelement:"+contents);
                highLight(e);
                return contents;
            }
            
            
            
            /**
             * wait for a few time to find the object displayed in the page
             * @param driver
             * @param e
             * @param timeout
             * @return true found the element visible displayed in the page ,false ,cannot find the webelement
             */
            public boolean waitForGUIAppear(WebElement e,long timeout){
                boolean findelement=false;
                WebDriverWait wdw=new WebDriverWait(driver, timeout);
                logger.info("wait for the object displayed in the page:"+getInnerHtmlCode(e));
                wdw.until(ExpectedConditions.visibilityOf(e));
                return findelement;
                
            }
            
            /**
             * scroll the view to we can see in the page
             * @param driver
             * @param e
             */
            public void scrollToView(WebElement e){
                   highLight(e);
                   executeJS("window.scrollTo(0,"+e.getLocation().y+")");
                   executeJS("arguments[0].scrollIntoView(true);", e);
                   logger.info("Now we scroll the view to the position we can see");
    
            }
            /**
             * click the upload button to upload the file ,this is for hte webFile element ,the input type is file
             * @param driver
             * @param e
             * @param filepath
             * http://sauceio.com/index.php/2012/03/selenium-tips-uploading-files-in-remote-webdriver/
             * upload the local file from remote webdriver
             */
            public void uploadFile(WebElement e,String filepath){
                String uploadcode=getInnerHtmlCode(e);
                highLight(e);
                logger.info("the upload webelement html code we get is:"+uploadcode);
                e.sendKeys(filepath);
            }
            
              
        
             /**
              * generate a email page loading row in the page loading table
             * @param stepname
             * @param stepchecker
             * @param status
             * @param comments
             * @param driver TODO
             * @throws IOException 
             */
            public static void generatePageLoadTime(String pagename,long pageloadtime) throws IOException{
                 String pageloadingfolder=SeleniumCore.getProjectWorkspace()+"reporter";
                 String pageloadingfile=pageloadingfolder+File.separator+"pageloading.log";
                 boolean updatedbefore=false;
                 File pagefile=null;
                 try{
                     
                    FilesUtils.newFolder(pageloadingfolder);
                    logger.debug("As there is no reporter folder,we created it again");
                     pagefile= new File(pageloadingfile);
                     
                     if (!pagefile.exists()) {
                         pagefile.createNewFile();
                        }            
                        BufferedReader br=new BufferedReader(new FileReader(pageloadingfile));
                        String strline = null;
                        while ((strline = br.readLine()) != null) {
                            if (strline.contains(pagename)) {
                                //find the status report we had reported before
                                FilesUtils.replaceStringOfFile(pageloadingfile,strline,pagename + "|" +pageloadtime);
                                updatedbefore=true;
                            }
                        }
                        br.close();
                        if(!updatedbefore){
                            //if this is the first time to report the step
                            FileWriter writer = new FileWriter(pageloadingfile, true);
                            BufferedWriter bufferwriter = new BufferedWriter(writer);
                            bufferwriter.write(pagename + " Loading Time|"+pageloadtime + "
    ");                    
                            bufferwriter.close();
                        }
                        
                    }
                        catch (IOException e) {
                            logger.error("Sorry Met the IOException for the reporter file :"
                                    + pagefile.getAbsolutePath() + " the error Exception is :"
                                    + e.getMessage());
                        }
                 
             }
    
            /**
             * get the current page loading time ,it will return seconds
             * @param driver
             * 
             * @see http://www.softwareishard.com/blog/firebug/support-for-performance-timing-in-firebug/
             * @see http://selenium.polteq.com/en/implement-web-timings/
             * @see http://www.html5rocks.com/en/tutorials/webperformance/basics/
             * @see http://www.theautomatedtester.co.uk/blog/2010/selenium-webtimings-api.html
             */
            public long getPageLoadTime(){
                long pageloadtime=0;
                long pagestarttime=0;
                long pageendtime=0;
                
                //try{
                //different with browser ,ie will return is double value but firefox and chrome will return is long
                  Object startobject=executeJSReturn("return window.performance.timing.navigationStart;");
                Object endobject=executeJSReturn("return window.performance.timing.loadEventEnd;");
                //@SuppressWarnings("unchecked")
                // pagetimer=executeJSReturn("var performance = window.performance || window.webkitPerformance || window.mozPerformance || window.msPerformance || {};"+
                  //             " var timings = performance.timing || {};"+
                    //           " return timings;");
                //long pageloadend=(pagetimer.get("loadEventEnd"))/1000;
               //    long pageloadstart=(pagetimer.get("navigationStart"))/1000;
                //pageloadtime=(pageloadend-pageloadstart);
                //think it's the firefox or chrome browser
                if(startobject instanceof Long){
                    pagestarttime=(Long) startobject;
                    logger.debug("the page navigate start time is:"+pagestarttime);
                }
                if(startobject instanceof Double){
                    Double tempvalue=(Double) startobject;
                    pagestarttime=new Double(tempvalue).longValue();
                    logger.debug("the page navigate start time is:"+pagestarttime);
                }
                if(endobject instanceof Long){
                    pageendtime=((Long) endobject);
                    logger.debug("the page end time is:"+pageendtime);
                }
                if(endobject instanceof Double){
                    double tempvalue=(Double) endobject;
                    pageendtime=new Double(tempvalue).longValue();
                    logger.debug("the page end time is:"+pageendtime);
                }
                
                pageloadtime=(pageendtime-pagestarttime)/1000;
                logger.info("Get current page loading time is:"+pageloadtime);
            
                return pageloadtime;
            }
            
            /**
             * sleep the current step for a few seconds 
             * @param seconds -- the seconds we need to sleep 
             * @throws InterruptedException
             * @author huchan
             */
            public void sleepSeconds(int seconds)
                     {
                logger.info("Begin to sleep current step for " + seconds
                        + " seconds........");
                //You need to be in a synchronized block in order for Object.wait() to work.
    
                //Also, I recommend looking at the concurrency packages instead of the old school threading packages. They are safer and way easier to work with.
                //synchronized (driver)
            //    {
                //    driver.wait(seconds * 1000);
            //    }
                try {
                    Thread.sleep(seconds*1000);
                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    logger.error("Sleep current step met an error:"+e.getMessage());
                }
            
            }    
            
            
           /**wait for the ajax to be completed
            * inspired by the the blow url:
            * @link  http://hedleyproctor.com/2012/07/effective-selenium-testing/
            * @link  http://stackoverflow.com/questions/3272883/how-to-use-selenium-2-pagefactory-init-elements-with-wait-until
            * @author huchan
            * @param timeoutInSeconds
            */
        public void waitForAjaxPresent(int timeoutInSeconds)  {             
                   if (driver instanceof JavascriptExecutor) {
                       final long currentbowserstate=(Long)executeJS("return return jQuery.active;");
                        logger.info("Current ajax active code  is:"+currentbowserstate);
                        WebDriverWait wdw=new WebDriverWait(driver, timeoutInSeconds);
                        ExpectedCondition<Boolean> ec=new ExpectedCondition<Boolean>() {
                            @Override
                            public Boolean apply(WebDriver driver) {
                                // TODO Auto-generated method stub
                                long newpagestate=(Long) executeJS("return return jQuery.active;");
                                logger.debug("the new ajax active code is:"+newpagestate);
                                return (newpagestate==0L);
                            }
                        };
                        
                        boolean loaded=wdw.until(ec);
                        logger.debug("finally the ajax had been loaded status is:"+loaded);
                    }
                    else{
                        logger.error("Web driver: " + driver + " cannot execute javascript");
                    }
                
                }
    }
    View Code
  • 相关阅读:
    【定位不准的烦心事系列】第2篇:卫星信号弱到底是咋回事
    高德「渲染练习生计划」启动,开启专业渲染技术人旅程!
    Mybatis第三方PageHelper分页插件原理
    List集合分页处理的方法
    什么是ETCD及其应用场景
    获取不到http请求头自定义参数
    etcd和Zookeeper孰优孰劣对比
    Zookeeper应用场景汇总(超详细)
    List集合分页处理的方法
    国产化之x64平台安装银河麒麟操作系统
  • 原文地址:https://www.cnblogs.com/seniortestingdev/p/3357354.html
Copyright © 2020-2023  润新知