5.22Java+selenium+chromedriver+maven脚本制作

5.22Java+selenium+chromedriver+maven脚本制作

本篇将记录下整个脚本制作的心得以及中间踩过的坑

内容介绍

  • 操作流程梳理

  • 类划分

  • 工具方法类划分

  • 各类编码


操作流程数据

该自动化脚本是为了满足一个实际的操作场景而编写的。具体的操作步骤如图:

类的划分

自己拆分了一个工具方法类、一个控制者抽象类、一个接口、两个具体实现类

  • 控制者抽象类--->由于使用的是selenium库里面的方法并且用了webdriver驱动。所以需要一个抽象类来指定驱动路径和实例化chromedriver对象并且用这一个对象操作全流程(类似单例设计模式)

  • 工具方法类--->从数据库查询出指定字段的数据并且返回回来,由于具体的操作执行一遍的时候只需要一个值,所以直接返回一个结果拿过来使用即可。对方法进行了封装

  • 一个接口--->由于登录的操作是固定的,所以登录过程用接口实现。在该接口定义了方法。

  • 两个具体实现类--->一个是登录类(实现了登录接口继承了抽象控制类,使用其对象操控浏览器)。另一个是具体操作流程类,继承了登录类,使用一个谷歌对象操控浏览器。

控制者类编码
package testprocess;

import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;


/**
* 这是一个控制者类
* 指定chromedriver在本地的路径
* @since JDK 1.8
* @date 2021/5/18
* @author Lucifer
*/
public abstract class MyChromeDriver {

   /*静态代码优先执行*/
   static
  {
       /*指定chromedriver驱动路径*/
       System.setProperty("webdriver.chrome.driver","C:/WebDriver/bin/chromedriver.exe");
  }

   /*实例化ChromeDriver对象*/
   WebDriver driver = new ChromeDriver();
}
数据库工具类
package sqlconnection;

import java.io.IOException;
import java.sql.*;

/**
* 数据库连接类--->JDBC
* 从数据库读取指定行的数据
* 写入到指定路径下的文本当中
* @since JDK 1.8
* @date 2021/5/18
* @author Lucifer
*/
public class SQLConnection {
   /*定义属性*/
   private Statement stmt = null;
   private Connection conn = null;
   private ResultSet rs = null;
   private String user = "www";
   private String password = "123456";
   private String ip = "192.168.1.20";
   private String port = "3306";
   private String databaseName = "erpapi";
   private String sql = "SELECT qrcodesn from wms_assets_qrcode where `status` = 0";
   private String qrecodesn = null;

   /**
    * 连接数据库的方法
    * @throws SQLException
    */
   public String startWebDriver() throws SQLException, IOException {
       /*加载JDBC驱动类*/
       try {
           /*反射驱动类*/
           Class.forName("com.mysql.jdbc.Diver").newInstance();
      }catch (Exception e){
           /*显示异常信息*/
           System.out.println(e.getMessage());
      }

       /*连接数据库*/
       try {
           conn = DriverManager.getConnection("jdbc:mysql://"
            + ip + ":" + port + "/" + databaseName, user, password);
           /*判断连接是否成功*/
           if (!conn.isClosed()){
               System.out.println("数据库连接成功!");
          }
      }catch (SQLException e){
           /*显示异常状态*/
           System.out.println("SQLState:" + e.getSQLState());
           System.out.println("VendorError:" + e.getErrorCode());
           e.printStackTrace();
      }

       /*创建statement类对象执行sql语句*/
       stmt = conn.createStatement();
       /*ResultSet类,存储获取的结果集*/
       rs = stmt.executeQuery(sql);
       try {
           /*获取qrcodesn这一列的数据*/
           while (rs.next()){
               qrecodesn = rs.getString("qrcodesn");
               System.out.println(qrecodesn);
          }
      }catch (Exception e){
           e.printStackTrace();
      }finally {
           /*关闭数据库*/
           conn.close();
           System.out.println(qrecodesn);
      }
       return qrecodesn;
  }
}
接口类编码
package testprocess;

/**
* 登录接口,定义了登录wms的方法
* @since JDK 1.8
* @date 2021/5/18
* @author Lucifer
*/
public interface WmsLogin {

   /**
    * 三个方法:
    * 1、输入账号
    * 2、输入密码
    * 3、点击登录按钮
    */
   void sendUserName(String username);

   void sendPassWord(String password);

   void clickButton() throws InterruptedException;
}
登录实现类
package testprocess;

import org.openqa.selenium.By;
import org.openqa.selenium.WebElement;

/**
* 登录操作
* 通过获取控制类对象实现登录接口实现操作步骤
* @since JDK 1.8
* @date 2021/5/18
* @author Lucifer
*/
public class Login extends MyChromeDriver implements WmsLogin {

   /**
    * 定义一些这个操作需要的属性
    * @param username
    */
   String url1 = "http://XXXXXXXXXX";
   String username = "XX";
   String password = "XXXXXXXX";

   @Override
   public void sendUserName(String username){
       /*进行找到账号框,输入账号*/
       WebElement User = driver.findElement(By.name("username"));
       User.sendKeys(username);
  }

   @Override
   public void sendPassWord(String password){
       /*找到密码框,输入密码*/
       WebElement PW = driver.findElement(By.name("password"));
       PW.sendKeys(password);
  }

   @Override
   public void clickButton() throws InterruptedException {
       /*找到登录按钮,点击按钮*/
       WebElement Submit = driver.findElement(By.id("submit"));
       Submit.click();
       /*wait:3s*/
       Thread.sleep(5000);
  }
}
操作流程实现类
package testprocess;

import org.apache.commons.lang3.RandomStringUtils;
import org.openqa.selenium.By;
import org.openqa.selenium.Keys;
import org.openqa.selenium.WebElement;
import sqlconnection.SQLConnection;

import java.io.IOException;
import java.sql.SQLException;


/**
* 定义了登录成功以后的操作过程
* @since JDK 1.8
* @date 2021/5/18
* @author Lucifer
*/
public class Operation extends Login{

/*实例化数据库连接类*/
SQLConnection sqlConnection = new SQLConnection();

/*定义这个过程需要用到的属性*/
public String url2 = "http://wmscntest.zs.com/v1/pda/picking/index.html";
private String string = RandomStringUtils.randomAlphanumeric(18); //这是一个类的方法,随机生成18位字符串
private String pickXpath = "/html/body/div[1]/div/section/div/div[3]/table/tbody/tr[1]/td[3]/button";
private String listId = "6955";
private String textXpath = "/html/body/div[5]/div[2]/input";
private String text2Xpath = "/html/body/div[1]/div/div/div/div/table/thead/tr[1]/th/div[3]/input";
private String skuXpath = "/html/body/div[1]/div/div/div/div/table/tbody/tr[1]/td[2]/div/div[1]";
private String sealXpath = "/html/body/div[1]/div/div/div/div/table/thead/tr[1]/th/div[2]/div/button[2]";
private String sealText = "/html/body/div[5]/div[2]/input";
private String sealTextSuccessfully = "/html/body/div[6]/div[2]/input";
private boolean state = false;
private String asideId = "6981";
// String asideXpath = "/html/body/div[1]/aside[1]/div/nav/ul/li[2]/ul/li[2]/a";

public void operation() throws SQLException, IOException, InterruptedException {

do {
/*定位"开始拣货"按钮*/
try {
WebElement pick = driver.findElement(By.xpath(pickXpath));
/*如果按钮文本为空,关闭会话*/
String pickText = pick.getText();
/*判断文本元素*/
if (pickText.equals("")){
/*关闭会话*/
driver.quit();
}
/*点击按钮*/
pick.click();
}catch (Exception e){
System.out.println(e.getMessage());
e.printStackTrace();
}

/*等待2秒*/
Thread.sleep(2000);

/*获取当前url*/
String currentUrl = driver.getCurrentUrl();

/*判断url*/
if (currentUrl.equals(url1)){
/*找到"拣货扫描"按钮*/
WebElement list = driver.findElement(By.id(listId));
list.click();
Thread.sleep(1000);
}else if (currentUrl.equals(url2)){
try {
/*定位文本输入框*/
WebElement text = driver.findElement(By.xpath(textXpath));
System.out.println("定位成功!");
/*执行SQL类的方法将内容写入文本框*/
text.sendKeys( sqlConnection.startWebDriver() + Keys.ENTER);
}catch (Exception e){
System.out.println("Can not input something!!!");
System.out.println(e.getMessage());
e.printStackTrace();
}
Thread.sleep(2000);
}

/*textXpath*/
try {
WebElement text = driver.findElement(By.xpath(textXpath));
System.out.println("定位成功!");
/*执行SQL类的方法将内容写入文本框*/
text.sendKeys( sqlConnection.startWebDriver() + Keys.ENTER);
}catch (Exception e){
System.out.println("无法定位到元素!!!");
System.out.println(e.getMessage());
e.printStackTrace();
}

/*等待两秒*/
Thread.sleep(1000);
/*定位物流扫码框*/
WebElement scan = driver.findElement(By.xpath(text2Xpath));

try {
/*定位sku*/
WebElement sku = driver.findElement(By.xpath(skuXpath));
while (sku != null){
/*将sku转成文本*/
String skuText1 = sku.getText();
/*在物流框内输入内容*/
scan.sendKeys(string + "$" + skuText1 + Keys.ENTER);
/*等待两秒*/
Thread.sleep(1000);
/*再次定位sku元素*/
sku = driver.findElement(By.xpath(skuXpath));
}
}catch (Exception e){
System.out.println(e.getMessage());
e.printStackTrace();
}

/*定位"封口"按钮*/
WebElement seal = driver.findElement(By.xpath(sealXpath));
seal.click();
/*等待两秒*/
Thread.sleep(1000);

/*Try to find successfully element*/
try {
WebElement sealTextSuccessful = driver.findElement(By.xpath(sealTextSuccessfully));
/*发送固定内容*/
sealTextSuccessful.sendKeys("SuccessfullyFinish" + Keys.ENTER);
}catch (Exception e){
e.printStackTrace();
}

Thread.sleep(3000);

/*回到"拣货列表"*/
try {
/*点击"拣货列表"*/
WebElement asideButton = driver.findElement(By.id(asideId));
/*点击按钮*/
asideButton.click();
/*定位"开始拣货"标签*/
WebElement pickAgain = driver.findElement(By.xpath(pickXpath));
/*使得布尔量为真*/
state = true;
}catch (Exception e){
/*布尔量为false*/
state = false;
System.out.println(e.getMessage());
e.printStackTrace();
}

// /*尝试定位输入框xpath*/
// try {
// WebElement sealText2 = driver.findElement(By.xpath(sealText));
// /*发送固定内容*/
// sealText2.sendKeys("Finish" + Keys.ENTER);
// /*退出浏览器*/
// driver.quit();
// }catch (Exception e){
// System.out.println("未输入Finish点击封口!");
// e.printStackTrace();
// }
}while (state == true);

// /*关闭会话*/
// driver.quit();
}

/**
* 执行方法
*/
public void start() throws SQLException, IOException, InterruptedException {
/*窗口最大化*/
driver.manage().window().maximize();
/*访问到指定的url*/
driver.get(url1);
sendUserName(username);
sendPassWord(password);
clickButton();
operation();
}
}
}

总结

  • 在处理一个从数据库查询数据写出到web页面的场景是想到的方法过于复杂--->之前想到先将数据库查询到的数据写入文本再从文本当中读取,这样在操作过程当中必须插入一大端io读流的代码,不能写成方法,因为是在io读流的过程中进行读取数据写入web的。如果读流结束最终指向是最后一位数的下一个节点为null。所以删掉了io读流的方法,直接将数据库读取的数据作为返回值返回实现了该功能。

  • 在处理一个标签内容的循环读取的时候没有考虑到在一次循环结束以后还要重新定位元素实现重复刷新新的标签内容的功能。

  •  

It's a lonely road!!!
原文地址:https://www.cnblogs.com/JunkingBoy/p/14798227.html