zoukankan      html  css  js  c++  java
  • 使用Selenium自动化测试web程序

    Selenium 是目前用的最广泛的Web UI 自动化测试框架,核心功能就是可以在多个浏览器上进行自动化测试。
    支持多平台:windows、linux、MAC ,支持多浏览器:ie、ff、safari、opera、chrome,多语言C、 java、ruby、python...
    Selenium IDE是firefox浏览器的一个插件。提供简单的脚本录制、编辑与回放功能。Selenium Grid是用来对测试脚步做分布式处理。现在已经集成到selenium server 中了。

    依赖:

        <dependencies>
            <!-- https://mvnrepository.com/artifact/org.seleniumhq.selenium/selenium-java -->
            <dependency>
                <groupId>org.seleniumhq.selenium</groupId>
                <artifactId>selenium-java</artifactId>
                <version>3.14.0</version>
            </dependency>
            <!-- https://mvnrepository.com/artifact/commons-io/commons-io -->
            <dependency>
                <groupId>commons-io</groupId>
                <artifactId>commons-io</artifactId>
                <version>2.6</version>
            </dependency>
        </dependencies>

    例子1:表单填充

            // 如果不设置将搜索环境变量
            System.setProperty("webdriver.chrome.driver", "C:\MyDrivers\selenium\chromedriver_win32\chromedriver.exe");
    
            WebDriver driver = new ChromeDriver();
            driver.get("http://www.baidu.com/");
            // 最大化窗口
            driver.manage().window().maximize();
            // 定制大小窗口
            //driver.manage().window().setSize(new Dimension(480, 800));
            Thread.sleep(1000);
        //提交表单(搜索字符)
            WebElement searchBox = driver.findElement(By.id("kw"));
            searchBox.sendKeys("ChromeDriver");
            searchBox.submit();
            Thread.sleep(3000);
        //退出
        driver.quit();

    例子2:元素定位

            //8种定位方式在Python selenium中所对应的方法为:
            findElement(By.id())
            findElement(By.name())
            findElement(By.className())
            findElement(By.tagName())
            findElement(By.linkText())
            findElement(By.partialLinkText())
            findElement(By.xpath())
            findElement(By.cssSelector())


    例子3:点击链接、后退、刷新浏览器

    //        //点击链接
    //        driver.findElement(By.linkText("新闻")).click();
    //        System.out.printf("now accesss %s 
    ", driver.getCurrentUrl());
    //        Thread.sleep(2000);
    
    //        //执行浏览器后退
    //        driver.navigate().back();
    //        System.out.printf("back to %s 
    ", driver.getCurrentUrl());
    //        Thread.sleep(2000);
    
    //        //刷新页面
    //        driver.navigate().refresh();

    例子4:鼠标、键盘事件

    // 鼠标右键点击指定的元素
            action.contextClick(driver.findElement(By.id("element"))).perform();
    
    // 鼠标右键点击指定的元素
            action.doubleClick(driver.findElement(By.id("element"))).perform();
    
    // 鼠标拖拽动作, 将 source 元素拖放到 target 元素的位置。
            WebElement source = driver.findElement(By.name("element"));
            WebElement target = driver.findElement(By.name("element"));
            action.dragAndDrop(source,target).perform();
    
    // 释放鼠标
            action.release().perform();
    
            WebElement input = driver.findElement(By.id("kw"));
    
            //输入框输入内容
            input.sendKeys("seleniumm");
            Thread.sleep(2000);
    
            //删除多输入的一个 m
            input.sendKeys(Keys.BACK_SPACE);
            Thread.sleep(2000);
    
            //输入空格键+“教程”
            input.sendKeys(Keys.SPACE);
            input.sendKeys("教程");
            Thread.sleep(2000);
    
            //ctrl+a 全选输入框内容
            input.sendKeys(Keys.CONTROL,"a");
            Thread.sleep(2000);
    
            //ctrl+x 剪切输入框内容
            input.sendKeys(Keys.CONTROL,"x");
            Thread.sleep(2000);
    
            //ctrl+v 粘贴内容到输入框
            input.sendKeys(Keys.CONTROL,"v");
            Thread.sleep(2000);
    
            //通过回车键盘来代替点击操作
            input.sendKeys(Keys.ENTER);
            Thread.sleep(2000);

    例子5:Xpath定位

            WebElement search = driver.findElement(By.id("kw"));
            search.sendKeys("Selenium");
            search.sendKeys(Keys.ENTER);
            Thread.sleep(2000);
    
            System.out.println("Search after================");
    
            //获取当前的 title 和 url
            System.out.printf("title of current page is %s
    ", driver.getTitle());
            System.out.printf("url of current page is %s
    ", driver.getCurrentUrl());
    
            //获取第一条搜索结果的标题
            WebElement result = driver.findElement(By.xpath("//div[@id='content_left']/div/h3/a"));
            System.out.println(result.getText());
    
            WebElement search_text =driver.findElement(By.id("kw"));
            search_text.sendKeys("selenium");
            search_text.submit();
            Thread.sleep(2000);


    例子6:定位元素组

            //定位元素组
            List<WebElement> search_result = driver.findElements(By.xpath("//div/div/h3"));
    
            //打印元素的个数
            System.out.println(search_result.size());
    
            // 循环打印搜索结果的标题
            for(WebElement result : search_result){
                System.out.println(result.getText());
            }
            //打印第n结果的标题
            WebElement text = search_result.get(search_result.size() - 10);
            System.out.println(text.getText());

    例子7:Javascript事件

         // 将页面滚动条拖到底部
        ((JavascriptExecutor)driver).executeScript("window.scrollTo(100,450);");
        Thread.sleep(3000);

    例子8:下拉框交互、弹窗交互

        driver.findElement(By.linkText("设置")).click();
            driver.findElement(By.linkText("搜索设置")).click();
            Thread.sleep(2000);
    
            //<select>标签的下拉框选择
            WebElement el = driver.findElement(By.xpath("//select"));
            Select sel = new Select(el);
            sel.selectByValue("20");//选第2个
            Thread.sleep(2000);
    
            //保存设置
            driver.findElement(By.className("prefpanelgo")).click();
    
            //接收弹窗
            driver.switchTo().alert().accept();
            Thread.sleep(2000);

    例子9:文件上传

            File srcFile = ((TakesScreenshot)driver).getScreenshotAs(OutputType.FILE);
            try {
                FileUtils.copyFile(srcFile,new File("d:\screenshot.png"));
            } catch (IOException e) {
                e.printStackTrace();
            }


    例10:自动登陆测试

    import java.util.concurrent.TimeUnit;
    import org.openqa.selenium.By;
    import org.openqa.selenium.WebDriver;
    import org.openqa.selenium.WebElement;
    import org.openqa.selenium.chrome.ChromeDriver;
    import org.testng.Assert;
    import org.testng.annotations.Test;
    
    public class LoginUsingSelenium {
    
        @Test
        public void login() {
            // TODO Auto-generated method stub
            
            System.setProperty("webdriver.chrome.driver", "path of driver");
            WebDriver driver=new ChromeDriver();
            driver.manage().window().maximize();
            driver.get("https://www.linkedin.com/login");
            
            WebElement username=driver.findElement(By.id("username"));
            WebElement password=driver.findElement(By.id("password"));
            WebElement login=driver.findElement(By.xpath("//button[text()='Sign in']"));
            
            username.sendKeys("example@gmail.com");
            password.sendKeys("password");
            login.click();
            
            String actualUrl="https://www.linkedin.com/feed/";
            String expectedUrl= driver.getCurrentUrl();
            
            Assert.assertEquals(expectedUrl,actualUrl);
            
            
        }
    
    }

    最后有个不错的云测试平台,可以实时测试和自动化测试,可以测试2000+桌面或移动端浏览器。
    https://www.lambdatest.com/selenium-automation
    如果是这个云端的测试,代码改写如下

    import java.net.URL;
    import java.util.concurrent.TimeUnit;
    
    import org.openqa.selenium.By;
    import org.openqa.selenium.JavascriptExecutor;
    import org.openqa.selenium.WebDriver;
    import org.openqa.selenium.WebElement;
    import org.openqa.selenium.chrome.ChromeDriver;
    import org.openqa.selenium.remote.DesiredCapabilities;
    import org.openqa.selenium.remote.RemoteWebDriver;
    import org.testng.Assert;
    import org.testng.annotations.BeforeClass;
    import org.testng.annotations.Test;
    
    public class LoginUsingSelenium {
    
    
        public RemoteWebDriver driver = null;
        public String url = "https://www.lambdatest.com/";
        public static final String  username= "sadhvisingh24";
        public static final String auth_key = "auth key generated";
        public static final String URL = "@hub.lambdatest.com/wd/hub";
        boolean status = false;
    
    
        @Test
        public void login () {
            // TODO Auto-generated method stub
            try {
    
                driver.manage().window().maximize();
                driver.get("https://www.linkedin.com/login");
    
                WebElement username = driver.findElement(By.id("username"));
                WebElement password = driver.findElement(By.id("password"));
                WebElement login = driver.findElement(By.xpath("//button[text()='Sign in']"));
    
                username.sendKeys("linkedin username");
                password.sendKeys("fake password");
                login.click();
    
                String actualUrl = "https://www.linkedin.com/feed/";
                String expectedUrl = driver.getCurrentUrl();
    
                if (actualUrl.equalsIgnoreCase(expectedUrl)) {
                    System.out.println("Test passed");
                    status = true; //Lambda status will be reflected as passed
                  } else {
                    System.out.println("Test failed"); //Lambda status will be reflected as passed
    
                }
            } catch (Exception e) {
                System.out.println(e.getMessage());
            }
            finally {
                tearDown();
            }
    
    
        }
    
    
    
        @BeforeClass
        public void setUp() {
            DesiredCapabilities capabilities = new DesiredCapabilities();
            capabilities.setCapability("browserName", "chrome");
            capabilities.setCapability("version", "72.0");
            capabilities.setCapability("platform", "win8"); // If this cap isn't specified, it will just get the any available one
            capabilities.setCapability("build", "TestNG_login_1");
            capabilities.setCapability("name", "TestNG_login_1");
            capabilities.setCapability("network", true); // To enable network logs
            capabilities.setCapability("visual", true); // To enable step by step screenshot
            capabilities.setCapability("video", true); // To enable video recording
            capabilities.setCapability("console", true); // To capture console logs
            try {
    
                driver = new RemoteWebDriver(new URL("https://" + username + ":" + auth_key + URL), capabilities);
    
            } catch (Exception e) {
    
                System.out.println("Invalid grid URL" + e.getMessage());
            }
    
        }
        private void tearDown () {
            if (driver != null) {
                ((JavascriptExecutor) driver).executeScript("lambda-status=" + status); //Lambda status will be reflected as either passed/ failed
    
                driver.quit();
    
                System.out.println("The setup process is completed");
    
            }
        }
    }
  • 相关阅读:
    Codeforces Round #498 (Div. 3) E. Military Problem
    codeforces ~ 1009 B Minimum Ternary String(超级恶心的思维题
    二叉排序树
    codeforces ~ 1004 C Sonya and Robots (dp)
    fragment shader的优化
    计算带宽
    trilinear filter
    GPU bubbles
    Dx12 occlusion query
    非意外的PDB错误 OK(0)
  • 原文地址:https://www.cnblogs.com/starcrm/p/12658301.html
Copyright © 2011-2022 走看看