• WebUi自动化调试小工具


    1.研发背景:

      web ui 自动化开发脚本的时候,有多少人是盲写?直到写完整个页面后运行调试,然后修改因为哪个元素没有定位到而报错,如何能一次性,高效的完成web ui脚本定位,所以纯手敲一款小工具每一步定位元素验证后写入脚本,方便,高效,提高脚本正确率!

    2.启动(java环境下):

       同级目录下放一个chromedriver.exe(选择下载一个适合自己本地chrome的驱动,不同版本下载地址参考这篇文章

    3.成品展示:

    产品体验:

    //启动 双击启动或者命令行启动,命令行启动的话可以查看一些打印的日志,方便查找错误问题
    C:\Users\Administrator\Desktop\uitest>java -jar testui.jar

     (1)点击执行,打开浏览器,消息弹框,关闭即可,后续可以去掉,先留的吧,方便定位问题

     浏览器已经打开了

     (2) 网页访问,启个本地自己的项目演示

     (3) 账号输入: 选择输入input 定位类型class ,定位值:输入,操作值输入:账号,点击执行(账号输入成功,弹框提示.确定关闭即可)

     (4) 密码输入: 选择定位方式为xpath,输入定位值:然后点击执行

     (5) 点击登录: 选择click方式,选择自己的定位类型,执行

    (6) 关闭浏览器,选择chrome开关,执行即可!

     (7) 命令行也可以查看日志

     4.暂时就演示这么多, 下面把源码分享给大家,需要的拿走不用谢!

    //浏览器操作类
    package xiaobing.com.ui;
    import org.openqa.selenium.By;
    import org.openqa.selenium.WebDriver;
    import org.openqa.selenium.WebElement;
    import org.openqa.selenium.chrome.ChromeDriver;
    import org.openqa.selenium.firefox.FirefoxDriver;
    import org.openqa.selenium.ie.InternetExplorerDriver;
    import org.openqa.selenium.remote.DesiredCapabilities;
    import org.openqa.selenium.support.ui.ExpectedConditions;
    import org.openqa.selenium.support.ui.WebDriverWait;
    
    public class BaseCase {
        private static WebDriver driver = null;
        /**
         * 根据浏览器类型去初始化驱动对象(启动浏览器)
         *
         * @param browserType
         */
        public WebDriver browserInit(String browserType,String driverPath) {
            //声明驱动对象
    
            System.out.println("***************Chrome浏览器初始化开始**************");
            if ("firefox".equalsIgnoreCase(browserType)) {
                //firefox
                //声明火狐安装路径,用于selenium去启动火狐
                System.setProperty("webdriver.firefox.bin", "D:\\firefox\\firefox.exe");
                //声明可执行驱动的路径,用于selenium加载启动
                System.setProperty("webdriver.gecko.driver", "src/main/resources/driver/geckodriver.exe");
                //打开浏览器,启动驱动实例+浏览器实例
                driver = new FirefoxDriver();
                System.out.println("创建FirefoxDriver对象成功");
                return driver;
            } else if ("chrome".equalsIgnoreCase(browserType)) {
                //chrome
                System.setProperty("webdriver.chrome.driver", driverPath);
                driver = new ChromeDriver();
                System.out.println("创建ChromeDriver对象成功");
                return driver;
            } else if ("ie".equalsIgnoreCase(browserType)) {
                //ie
                System.setProperty("webdriver.ie.driver", "src/main/resources/driver/IEDriverServer.exe");
                //创建Capabilities对象
                DesiredCapabilities capabilities = new DesiredCapabilities();
                //浏览器安全模式保持一致
                capabilities.setCapability(InternetExplorerDriver.INTRODUCE_FLAKINESS_BY_IGNORING_SECURITY_DOMAINS, true);
                //浏览器缩放比例保持正常
                capabilities.setCapability(InternetExplorerDriver.IGNORE_ZOOM_SETTING, true);
                driver = new InternetExplorerDriver(capabilities);
                System.out.println("创建InternetExplorerDriver对象成功");
                return driver;
            }
            return driver;
    
        }
        public static WebElement getElement(String type, String byType,String byValue) {
            By by = null;
            if ("id".equalsIgnoreCase(byType)) {
                by = By.id(byValue);
            } else if ("name".equalsIgnoreCase(byType)) {
                by = By.name(byValue);
            } else if ("class".equalsIgnoreCase(byType)) {
                by = By.className(byValue);
            } else if ("tagname".equalsIgnoreCase(byType)) {
                by = By.tagName(byValue);
            } else if ("linktext".equalsIgnoreCase(byType)) {
                by = By.linkText(byValue);
            } else if ("partiallinktext".equalsIgnoreCase(byType)) {
                by = By.partialLinkText(byValue);
            } else if ("cssselector".equalsIgnoreCase(byType)) {
                by = By.cssSelector(byValue);
            } else if ("xpath".equalsIgnoreCase(byType)) {
                by = By.xpath(byValue);
            } else {
                String tips = "sorry,请重新选择,暂不支持【" + byType + "】定位方式";
                System.out.println(tips);
            }
    
            WebElement webElement = null;
            try {
                WebDriverWait wait = new WebDriverWait(driver, 10);
                webElement = wait.until(ExpectedConditions.visibilityOfElementLocated(by));
                //记录下当前定位元素,便于查看元素无法操作抛出的问题
                return webElement;
            } catch (Exception e) {
                String tips = "【定位元素失败,请检查】【" + type + "】【" + byType + " : " + byValue + "】";
                System.out.println(tips);
    
            }
            return webElement;
        }
        /**
         * 关闭浏览器
         *
         * @param driver
         * @throws InterruptedException
         */
        public void browserDown(WebDriver driver) {
            //关闭浏览器,关闭可执行驱动
            driver.quit();
            System.out.println("***************测试场景执行结束**************");
        }
    }

    工具类:

    package xiaobing.com.ui;
    
    import org.openqa.selenium.WebDriver;
    
    import javax.swing.*;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    
    public class TestUiElement {
        public static void main(String[] args) {
            new xiaobing.com.ui.Window2().setVisible(true);
        }
    }
    
    class Window2 extends JFrame {
        static private JTextField value1;
        static private JTextField value2;
        static private String type = "click";
        static private String by = "id,class,name";
        static private JPanel panel;
        static private JComboBox jcbox;
        static private JComboBox byTypejcbox;
        static private WebDriver driver = null;
        static private BaseCase baseCase = new BaseCase();
        static private boolean chromeStatus = true;
    
    
        public Window2() {
            //设置窗口属性
            super("Ui脚本调试(Chrome)");
            this.setSize(300, 250);
            this.setLayout(null);
            this.setLocation(500, 500);
            this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    
            panel = new JPanel();
    
            // 创建 JLabel
            JLabel phoneLabel = new JLabel("操作值:");
            /* 这个方法定义了组件的位置。
             * setBounds(x, y, width, height)
             * x 和 y 指定左上角的新位置,由 width 和 height 指定新的大小。
             */
            phoneLabel.setBounds(10, 20, 80, 25);
    //        panel.setLayout(new GridLayout(0,1));
            panel.add(phoneLabel);
    
            /*
             * 创建文本域用于用户输入
             */
            value1 = new JTextField(20);
            value1.setBounds(100, 20, 165, 25);
            panel.add(value1);
    
            // 输入Channel的文本域
            JLabel channelLabel = new JLabel("调试值:");
            channelLabel.setBounds(20, 50, 10, 25);
            panel.add(channelLabel);
    
    
            //输入的信息会以点号代替,密码的安全性
    //        channelText = new JPasswordField(20);
            value2 = new JTextField(20);
            value2.setBounds(100, 50, 30, 25);
            panel.add(value2);
    
    
            JLabel choiceLabel = new JLabel("请选择:");
            choiceLabel.setBounds(20, 50, 30, 25);
            panel.add(choiceLabel);
    
            //下拉框---操作
            String[] behavior = new String[]{"open", "click", "input", "chrome开关"};
            jcbox = new JComboBox(behavior);
            jcbox.setBounds(50, 50, 600, 30);
    
            panel.add(jcbox);
    
            //下拉框---渠道
            String[] byType = new String[]{"id", "xpath", "name", "class", "tagname", "linktext", "partiallinktext", "cssselector"};
            byTypejcbox = new JComboBox(byType);
            byTypejcbox.setBounds(50, 50, 30, 30);
            panel.add(byTypejcbox);
    
    
            //渠道--下拉选触发事件
            byTypejcbox.addActionListener(new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent e) {
                    by = (String) byTypejcbox.getSelectedItem();
                    System.out.println(by + "被选中2222");
                }
            });
    
            //操作--下拉选触发事件
            jcbox.addActionListener(new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent e) {
                    type = (String) jcbox.getSelectedItem();
                    System.out.println(type + "被选中");
                    if (type.equalsIgnoreCase("chrome开关")) {
                        //打开浏览器赋值驱动路径
                        value1.setText(System.getProperty("user.dir") + "\\chromedriver.exe");
                    }
    
                }
            });
    
            // 创建执行按钮
            JButton button = new JButton("执行");
            button.setBounds(30, 80, 80, 25);
            panel.add(button);
    
            //添加面板
            setContentPane(panel);
    
            //按钮触发事件
            button.addActionListener(new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent e) {
                    String result = "";
                    try {
                        if (type.equalsIgnoreCase("chrome开关")) {
                            if (chromeStatus) {
                                //浏览器初始化
                                driver = baseCase.browserInit("chrome", value1.getText());
                                chromeStatus = false;
                                result = "【chrome】初始化,【" + value1.getText() + "】";
                            } else {
                                baseCase.browserDown(driver);
                                chromeStatus = true;
                                result = "【chrome】关闭";
                            }
                        }
                        if (type.equalsIgnoreCase("open")) {
                            driver.get(value1.getText());
                            result = type + "【" + value1.getText() + "】";
                        }
                        if (type.equalsIgnoreCase("click")) {
                            baseCase.getElement(type, by, value2.getText()).click();
                            result = "【" + type + "】【" + by + "】【" + value2.getText() + "】";
                        }
                        if (type.equalsIgnoreCase("input")) {
                            baseCase.getElement(type, by, value2.getText()).sendKeys(value1.getText());
                            result = "【" + type + "】【" + by + "】【" + value2.getText() + "】【" + value1.getText() + "】";
                        }
                    } catch (Exception ee) {
                        result = ee.getMessage();
                    }
                    System.out.println(result);
                    JOptionPane.showMessageDialog(null, result);
                }
            });
        }
    }
    //pom.xml
    <?xml version="1.0" encoding="UTF-8"?>
    
    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
      <modelVersion>4.0.0</modelVersion>
    
      <groupId>xiaobing.com</groupId>
      <artifactId>uitest_demo</artifactId>
      <version>1.0-SNAPSHOT</version>
    
      <name>uitest_demo</name>
      <url>http://www.example.com</url>
    
      <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <maven.compiler.source>1.7</maven.compiler.source>
        <maven.compiler.target>1.7</maven.compiler.target>
      </properties>
    
      <dependencies>
        <dependency>
        <dependency>
          <groupId>org.seleniumhq.selenium</groupId>
          <artifactId>selenium-java</artifactId>
          <version>3.141.59</version>
        </dependency>
      </dependencies>
    
      <build>
        <pluginManagement>
          <plugins>
            <plugin>
              <artifactId>maven-clean-plugin</artifactId>
              <version>3.1.0</version>
            </plugin>
            <plugin>
              <artifactId>maven-resources-plugin</artifactId>
              <version>3.0.2</version>
            </plugin>
            <plugin>
              <artifactId>maven-compiler-plugin</artifactId>
              <version>3.8.0</version>
            </plugin>
            <plugin>
              <artifactId>maven-surefire-plugin</artifactId>
              <version>2.22.1</version>
            </plugin>
            <plugin>
              <artifactId>maven-jar-plugin</artifactId>
              <version>3.0.2</version>
            </plugin>
            <plugin>
              <artifactId>maven-install-plugin</artifactId>
              <version>2.5.2</version>
            </plugin>
            <plugin>
              <artifactId>maven-deploy-plugin</artifactId>
              <version>2.8.2</version>
            </plugin>
            <plugin>
              <artifactId>maven-site-plugin</artifactId>
              <version>3.7.1</version>
            </plugin>
            <plugin>
              <artifactId>maven-project-info-reports-plugin</artifactId>
              <version>3.0.0</version>
            </plugin>
            <plugin>
              <artifactId>maven-assembly-plugin</artifactId>
              <configuration>
                <descriptorRefs>
                  <descriptorRef>jar-with-dependencies</descriptorRef>
                </descriptorRefs>
                <archive>
                  <manifest>
                    <mainClass>xiaobing.com.ui.TestUiElement</mainClass>
                  </manifest>
                </archive>
              </configuration>
              <executions>
                <execution>
                  <id>make-assembly</id>
                  <phase>package</phase>
                  <goals>
                    <goal>single</goal>
                  </goals>
                </execution>
              </executions>
            </plugin>
          </plugins>
        </pluginManagement>
      </build>
    </project>

    5.源码奉上,自己原创,亲测!需要的大家一起交流,打包请自行百度,需要现成的jar包请留言联系!

  • 相关阅读:
    Lua小技巧
    Lua中使用table实现的其它5种数据结构
    Lua 5.3 协程简单示例
    Lua 5.3 迭代器的简单示例
    Lua函数以及闭合函数的理解
    BabeLua常见问题
    Windows下的lua-5.3.4安装过程
    C++ 设计模式 开放封闭原则 简单示例
    UML基础系列:类图
    面向对象程序设计基本概念
  • 原文地址:https://www.cnblogs.com/xiaozhaoboke/p/16388520.html
Copyright © 2020-2023  润新知