提交 962b79f9 authored 作者: 黄承天's avatar 黄承天

Initial commit

上级
HELP.md
target/
!.mvn/wrapper/maven-wrapper.jar
!**/src/main/**
!**/src/test/**
### STS ###
.apt_generated
.classpath
.factorypath
.project
.settings
.springBeans
.sts4-cache
### IntelliJ IDEA ###
.idea
*.iws
*.iml
*.ipr
### NetBeans ###
/nbproject/private/
/nbbuild/
/dist/
/nbdist/
/.nb-gradle/
build/
### VS Code ###
.vscode/
/*
* Copyright 2007-present the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* https://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import java.net.*;
import java.io.*;
import java.nio.channels.*;
import java.util.Properties;
public class MavenWrapperDownloader {
private static final String WRAPPER_VERSION = "0.5.6";
/**
* Default URL to download the maven-wrapper.jar from, if no 'downloadUrl' is provided.
*/
private static final String DEFAULT_DOWNLOAD_URL = "https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/"
+ WRAPPER_VERSION + "/maven-wrapper-" + WRAPPER_VERSION + ".jar";
/**
* Path to the maven-wrapper.properties file, which might contain a downloadUrl property to
* use instead of the default one.
*/
private static final String MAVEN_WRAPPER_PROPERTIES_PATH =
".mvn/wrapper/maven-wrapper.properties";
/**
* Path where the maven-wrapper.jar will be saved to.
*/
private static final String MAVEN_WRAPPER_JAR_PATH =
".mvn/wrapper/maven-wrapper.jar";
/**
* Name of the property which should be used to override the default download url for the wrapper.
*/
private static final String PROPERTY_NAME_WRAPPER_URL = "wrapperUrl";
public static void main(String args[]) {
System.out.println("- Downloader started");
File baseDirectory = new File(args[0]);
System.out.println("- Using base directory: " + baseDirectory.getAbsolutePath());
// If the maven-wrapper.properties exists, read it and check if it contains a custom
// wrapperUrl parameter.
File mavenWrapperPropertyFile = new File(baseDirectory, MAVEN_WRAPPER_PROPERTIES_PATH);
String url = DEFAULT_DOWNLOAD_URL;
if (mavenWrapperPropertyFile.exists()) {
FileInputStream mavenWrapperPropertyFileInputStream = null;
try {
mavenWrapperPropertyFileInputStream = new FileInputStream(mavenWrapperPropertyFile);
Properties mavenWrapperProperties = new Properties();
mavenWrapperProperties.load(mavenWrapperPropertyFileInputStream);
url = mavenWrapperProperties.getProperty(PROPERTY_NAME_WRAPPER_URL, url);
} catch (IOException e) {
System.out.println("- ERROR loading '" + MAVEN_WRAPPER_PROPERTIES_PATH + "'");
} finally {
try {
if (mavenWrapperPropertyFileInputStream != null) {
mavenWrapperPropertyFileInputStream.close();
}
} catch (IOException e) {
// Ignore ...
}
}
}
System.out.println("- Downloading from: " + url);
File outputFile = new File(baseDirectory.getAbsolutePath(), MAVEN_WRAPPER_JAR_PATH);
if (!outputFile.getParentFile().exists()) {
if (!outputFile.getParentFile().mkdirs()) {
System.out.println(
"- ERROR creating output directory '" + outputFile.getParentFile().getAbsolutePath() + "'");
}
}
System.out.println("- Downloading to: " + outputFile.getAbsolutePath());
try {
downloadFileFromURL(url, outputFile);
System.out.println("Done");
System.exit(0);
} catch (Throwable e) {
System.out.println("- Error downloading");
e.printStackTrace();
System.exit(1);
}
}
private static void downloadFileFromURL(String urlString, File destination) throws Exception {
if (System.getenv("MVNW_USERNAME") != null && System.getenv("MVNW_PASSWORD") != null) {
String username = System.getenv("MVNW_USERNAME");
char[] password = System.getenv("MVNW_PASSWORD").toCharArray();
Authenticator.setDefault(new Authenticator() {
@Override
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(username, password);
}
});
}
URL website = new URL(urlString);
ReadableByteChannel rbc;
rbc = Channels.newChannel(website.openStream());
FileOutputStream fos = new FileOutputStream(destination);
fos.getChannel().transferFrom(rbc, 0, Long.MAX_VALUE);
fos.close();
rbc.close();
}
}
distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.6.3/apache-maven-3.6.3-bin.zip
wrapperUrl=https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar
[0317/143800.973:ERROR:http_transport_win.cc(276)] WinHttpSendRequest: 操作成功完成。 (0x0)
[0317/161122.615:ERROR:http_transport_win.cc(276)] WinHttpSendRequest: 操作成功完成。 (0x0)
[0317/163728.557:ERROR:http_transport_win.cc(276)] WinHttpSendRequest: 操作成功完成。 (0x0)
差异被折叠。
@REM ----------------------------------------------------------------------------
@REM Licensed to the Apache Software Foundation (ASF) under one
@REM or more contributor license agreements. See the NOTICE file
@REM distributed with this work for additional information
@REM regarding copyright ownership. The ASF licenses this file
@REM to you under the Apache License, Version 2.0 (the
@REM "License"); you may not use this file except in compliance
@REM with the License. You may obtain a copy of the License at
@REM
@REM https://www.apache.org/licenses/LICENSE-2.0
@REM
@REM Unless required by applicable law or agreed to in writing,
@REM software distributed under the License is distributed on an
@REM "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
@REM KIND, either express or implied. See the License for the
@REM specific language governing permissions and limitations
@REM under the License.
@REM ----------------------------------------------------------------------------
@REM ----------------------------------------------------------------------------
@REM Maven Start Up Batch script
@REM
@REM Required ENV vars:
@REM JAVA_HOME - location of a JDK home dir
@REM
@REM Optional ENV vars
@REM M2_HOME - location of maven2's installed home dir
@REM MAVEN_BATCH_ECHO - set to 'on' to enable the echoing of the batch commands
@REM MAVEN_BATCH_PAUSE - set to 'on' to wait for a keystroke before ending
@REM MAVEN_OPTS - parameters passed to the Java VM when running Maven
@REM e.g. to debug Maven itself, use
@REM set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000
@REM MAVEN_SKIP_RC - flag to disable loading of mavenrc files
@REM ----------------------------------------------------------------------------
@REM Begin all REM lines with '@' in case MAVEN_BATCH_ECHO is 'on'
@echo off
@REM set title of command window
title %0
@REM enable echoing by setting MAVEN_BATCH_ECHO to 'on'
@if "%MAVEN_BATCH_ECHO%" == "on" echo %MAVEN_BATCH_ECHO%
@REM set %HOME% to equivalent of $HOME
if "%HOME%" == "" (set "HOME=%HOMEDRIVE%%HOMEPATH%")
@REM Execute a user defined script before this one
if not "%MAVEN_SKIP_RC%" == "" goto skipRcPre
@REM check for pre script, once with legacy .bat ending and once with .cmd ending
if exist "%HOME%\mavenrc_pre.bat" call "%HOME%\mavenrc_pre.bat"
if exist "%HOME%\mavenrc_pre.cmd" call "%HOME%\mavenrc_pre.cmd"
:skipRcPre
@setlocal
set ERROR_CODE=0
@REM To isolate internal variables from possible post scripts, we use another setlocal
@setlocal
@REM ==== START VALIDATION ====
if not "%JAVA_HOME%" == "" goto OkJHome
echo.
echo Error: JAVA_HOME not found in your environment. >&2
echo Please set the JAVA_HOME variable in your environment to match the >&2
echo location of your Java installation. >&2
echo.
goto error
:OkJHome
if exist "%JAVA_HOME%\bin\java.exe" goto init
echo.
echo Error: JAVA_HOME is set to an invalid directory. >&2
echo JAVA_HOME = "%JAVA_HOME%" >&2
echo Please set the JAVA_HOME variable in your environment to match the >&2
echo location of your Java installation. >&2
echo.
goto error
@REM ==== END VALIDATION ====
:init
@REM Find the project base dir, i.e. the directory that contains the folder ".mvn".
@REM Fallback to current working directory if not found.
set MAVEN_PROJECTBASEDIR=%MAVEN_BASEDIR%
IF NOT "%MAVEN_PROJECTBASEDIR%"=="" goto endDetectBaseDir
set EXEC_DIR=%CD%
set WDIR=%EXEC_DIR%
:findBaseDir
IF EXIST "%WDIR%"\.mvn goto baseDirFound
cd ..
IF "%WDIR%"=="%CD%" goto baseDirNotFound
set WDIR=%CD%
goto findBaseDir
:baseDirFound
set MAVEN_PROJECTBASEDIR=%WDIR%
cd "%EXEC_DIR%"
goto endDetectBaseDir
:baseDirNotFound
set MAVEN_PROJECTBASEDIR=%EXEC_DIR%
cd "%EXEC_DIR%"
:endDetectBaseDir
IF NOT EXIST "%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config" goto endReadAdditionalConfig
@setlocal EnableExtensions EnableDelayedExpansion
for /F "usebackq delims=" %%a in ("%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config") do set JVM_CONFIG_MAVEN_PROPS=!JVM_CONFIG_MAVEN_PROPS! %%a
@endlocal & set JVM_CONFIG_MAVEN_PROPS=%JVM_CONFIG_MAVEN_PROPS%
:endReadAdditionalConfig
SET MAVEN_JAVA_EXE="%JAVA_HOME%\bin\java.exe"
set WRAPPER_JAR="%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.jar"
set WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain
set DOWNLOAD_URL="https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar"
FOR /F "tokens=1,2 delims==" %%A IN ("%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.properties") DO (
IF "%%A"=="wrapperUrl" SET DOWNLOAD_URL=%%B
)
@REM Extension to allow automatically downloading the maven-wrapper.jar from Maven-central
@REM This allows using the maven wrapper in projects that prohibit checking in binary data.
if exist %WRAPPER_JAR% (
if "%MVNW_VERBOSE%" == "true" (
echo Found %WRAPPER_JAR%
)
) else (
if not "%MVNW_REPOURL%" == "" (
SET DOWNLOAD_URL="%MVNW_REPOURL%/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar"
)
if "%MVNW_VERBOSE%" == "true" (
echo Couldn't find %WRAPPER_JAR%, downloading it ...
echo Downloading from: %DOWNLOAD_URL%
)
powershell -Command "&{"^
"$webclient = new-object System.Net.WebClient;"^
"if (-not ([string]::IsNullOrEmpty('%MVNW_USERNAME%') -and [string]::IsNullOrEmpty('%MVNW_PASSWORD%'))) {"^
"$webclient.Credentials = new-object System.Net.NetworkCredential('%MVNW_USERNAME%', '%MVNW_PASSWORD%');"^
"}"^
"[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12; $webclient.DownloadFile('%DOWNLOAD_URL%', '%WRAPPER_JAR%')"^
"}"
if "%MVNW_VERBOSE%" == "true" (
echo Finished downloading %WRAPPER_JAR%
)
)
@REM End of extension
@REM Provide a "standardized" way to retrieve the CLI args that will
@REM work with both Windows and non-Windows executions.
set MAVEN_CMD_LINE_ARGS=%*
%MAVEN_JAVA_EXE% %JVM_CONFIG_MAVEN_PROPS% %MAVEN_OPTS% %MAVEN_DEBUG_OPTS% -classpath %WRAPPER_JAR% "-Dmaven.multiModuleProjectDirectory=%MAVEN_PROJECTBASEDIR%" %WRAPPER_LAUNCHER% %MAVEN_CONFIG% %*
if ERRORLEVEL 1 goto error
goto end
:error
set ERROR_CODE=1
:end
@endlocal & set ERROR_CODE=%ERROR_CODE%
if not "%MAVEN_SKIP_RC%" == "" goto skipRcPost
@REM check for post script, once with legacy .bat ending and once with .cmd ending
if exist "%HOME%\mavenrc_post.bat" call "%HOME%\mavenrc_post.bat"
if exist "%HOME%\mavenrc_post.cmd" call "%HOME%\mavenrc_post.cmd"
:skipRcPost
@REM pause the script if MAVEN_BATCH_PAUSE is set to 'on'
if "%MAVEN_BATCH_PAUSE%" == "on" pause
if "%MAVEN_TERMINATE_CMD%" == "on" exit %ERROR_CODE%
exit /B %ERROR_CODE%
<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.2.5.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.zjty</groupId>
<artifactId>autotest</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>autotest</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.5</version>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger2</artifactId>
<version>2.9.1</version>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger-ui</artifactId>
<version>2.9.1</version>
</dependency>
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>28.2-jre</version>
</dependency>
<!--fastJson-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.46</version>
</dependency>
<!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.18</version>
</dependency>
<!--lombok 用于简化domain配置-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.16.20</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency>
<!-- https://mvnrepository.com/artifact/org.seleniumhq.selenium/selenium-java -->
<dependency>
<groupId>org.seleniumhq.selenium</groupId>
<artifactId>selenium-java</artifactId>
<version>4.0.0-alpha-4</version>
</dependency>
</dependencies>
<build>
<defaultGoal>compile</defaultGoal>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
<resources>
<resource>
<directory>${basedir}/src/main/resources</directory>
<includes>
<include>**/**</include>
</includes>
</resource>
<resource>
<directory>${basedir}/src/main/webapp</directory>
<targetPath>META-INF/resources</targetPath>
<includes>
<include>**/**</include>
</includes>
</resource>
</resources>
</build>
</project>
package com.zjty.autotest;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class AutotestApplication {
public static void main(String[] args) {
SpringApplication.run(AutotestApplication.class, args);
}
}
package com.zjty.autotest.common.action;
/**
* <p>Description : measurement
* <p>Date : 2020/1/8 11:37
* <p>@author : C
*/
public interface Action {
String INPUT = "input";
String CLICK = "click";
String SWITCH = "switch";
String HOME = "home";
String CLEAR = "clear";
String SELECT = "select";
}
package com.zjty.autotest.common.action;
/**
* equals、not_equals、exist、not_exist
*/
public interface Assertion {
String EQUALS = "equals";
String NOT_EQUALS = "not_equals";
String EXIST = "exist";
String NOT_EXIST = "not_exist";
}
package com.zjty.autotest.common.action;
/**
* <p>Description : measurement
* <p>Date : 2020/1/14 10:38
* <p>@author : C
*/
public interface Browser {
String FIREFOX = "firefox";
String CHROME = "chrome";
String IE = "ie";
}
package com.zjty.autotest.common.action;
/**
* <p>Description : measurement
* <p>Date : 2020/1/13 16:41
* <p>@author : C
*/
public interface ByType {
String XPATH = "xpath";
String CSS = "css";
String ID = "id";
String NAME = "name";
String LINK_TEXT = "link_text";
}
package com.zjty.autotest.common.action;
/**
* <p>Description : measurement
* <p>Date : 2020/1/13 9:56
* <p>@author : C
*/
public interface LabelType {
String A = "a";
String INPUT = "input";
String BUTTON = "button";
String LINK = "link";
String SPAN = "span";
}
package com.zjty.autotest.config;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.CorsRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
@Configuration
public class CorsConfig implements WebMvcConfigurer {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**")
.allowedOrigins("*")
.allowedMethods("GET", "HEAD", "POST", "PUT", "DELETE", "OPTIONS")
.allowCredentials(true)
.maxAge(3600)
.allowedHeaders("*");
}
}
\ No newline at end of file
package com.zjty.autotest.config;
import com.google.common.collect.Sets;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import springfox.documentation.builders.ApiInfoBuilder;
import springfox.documentation.builders.PathSelectors;
import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.service.ApiInfo;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;
import springfox.documentation.swagger2.annotations.EnableSwagger2;
/**
* fusion-platform.
*
* @author : Matrix [xhyrzldf@gmail.com]
* 19-1-10 .
*/
@Configuration
@EnableSwagger2
public class Swagger2Config {
@Bean
public Docket createRestApi() {
return new Docket(DocumentationType.SWAGGER_2)
.produces(Sets.newHashSet("application/json"))
.consumes(Sets.newHashSet("application/json"))
.protocols(Sets.newHashSet("http","https"))
.apiInfo(apiInfo())
.forCodeGeneration(true)
.useDefaultResponseMessages(true)
.select()
// 指定controller存放的目录路径
.apis(RequestHandlerSelectors.basePackage("com.zjty.autotest"))
.paths(PathSelectors.any())
.build();
}
private ApiInfo apiInfo() {
return new ApiInfoBuilder()
// 文档标题
.title("测评系统接口测试")
// 文档描述
.description("测评系统接口测试页面")
.version("v1")
.build();
}
}
package com.zjty.autotest.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
@SuppressWarnings("SpringMVCViewInspection")
@Controller
public class ResourceController {
@RequestMapping("index")
public String index(){
return "index.html";
}
}
package com.zjty.autotest.pojo.report;
import io.swagger.annotations.ApiModel;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* <p>Description : measurement
* <p>Date : 2020/1/16 13:39
* <p>@author : C
* 路由测试详情
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
@ApiModel(value = "测试步骤结果")
public class Measure {
/**
* 网站地址
*/
private String url;
/**
* 是否通过
*/
private Boolean success;
/**
* 响应时间
*/
private Integer responseTime;
/**
* 相关信息(未通过理由)
*/
private String message;
/**
* 截图的url
*/
private String picture;
}
package com.zjty.autotest.pojo.report;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.List;
/**
* <p>Description : selenium-test
* <p>Date : 2020/1/3 9:43
* <p>@author : C
* 测试报告
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Report {
/**
* 主键
*/
private Integer id;
/**
* 所属项目id
*/
private Integer projectId;
/**
* 测试项目名
*/
private String projectName;
/**
* 浏览器
*/
private String browser;
/**
* 操作系统
*/
private String os;
/**
* 测试结果信息
*/
private String message;
/**
* 每个路由测试详情
*/
private List<Measure> measures;
}
package com.zjty.autotest.pojo.test;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* <p>Description : selenium-test
* <p>Date : 2020/1/3 9:47
* <p>@author : C
* 输入参数
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Input {
/**
* 关键字
*/
private String key;
/**
* 属性名(根据属性名和属性值匹配元素)
*/
private String attrName;
/**
* 属性值(根据属性名和属性值匹配元素)
*/
private String attrValue;
/**
* 输入值
*/
private String value;
}
package com.zjty.autotest.pojo.test;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.List;
/**
* 测试项目
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Project {
/**
* 主键
*/
private String id;
/**
* 项目名称
*/
private String name;
/**
* 浏览器
*/
private String browser;
/**
* 测试入口地址
*/
private String url;
/**
* 输入参数
*/
private List<Input> inputs;
}
package com.zjty.autotest.service;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
import com.google.common.collect.Queues;
import com.google.common.collect.Sets;
import lombok.extern.slf4j.Slf4j;
import org.openqa.selenium.By;
import org.openqa.selenium.StaleElementReferenceException;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.springframework.stereotype.Service;
import java.util.*;
import static com.zjty.autotest.common.action.LabelType.*;
import static java.util.Objects.nonNull;
@SuppressWarnings("FieldCanBeLocal")
@Slf4j
@Service
public class SeleniumExecutor {
private WebDriver driver;
private Map<String, String> inputs = Maps.newHashMap();
private Set<String> historyUrls = Sets.newHashSet();
private Queue<String> windowQueue = Queues.newLinkedBlockingDeque();
private Queue<String> urlQueue = Queues.newLinkedBlockingDeque();
private List<WebElement> elements = Lists.newArrayList();
private Integer elementIndex;
private String currentWindow;
private String currentUrl;
public List<String> execute(String url) {
driver.get(url);
currentUrl = driver.getCurrentUrl();
currentWindow = driver.getWindowHandle();
while (nonNull(currentWindow)) {
driver.switchTo().window(currentWindow);
while (nonNull(currentUrl)) {
testUrl(currentUrl);
currentUrl = urlQueue.poll();
}
currentWindow = windowQueue.poll();
driver.close();
checkWindow();
}
return Lists.newArrayList(historyUrls);
}
private void testUrl(String currentUrl) {
if (!historyUrls.contains(currentUrl)) {
historyUrls.add(driver.getCurrentUrl());
log.info("当前URL:{} 开始进行遍历...", currentUrl);
log.info("正在获取当前网页所有元素...");
getAllElements(driver);
log.info("获取完毕...共{}个元素...", elements.size());
elementIndex = 0;
traversal();
log.info("遍历完毕...");
}
}
private void traversal() {
try {
while (elementIndex < elements.size()) {
WebElement element = elements.get(elementIndex);
act(element);
checkPage();
}
} catch (Exception e) {
log.error("error:" + e.getMessage());
}
}
private void act(WebElement element) {
try {
log.info("正在操作第{}个元素 ------ text:[{}] ----- tag:[{}]", elementIndex + 1, element.getText(), element.getTagName());
elementIndex++;
if (isEnabledAndDisplayed(element)){
if (isEnabledInput(element)) {
String id = element.getAttribute("id");
String inputValue = inputs.get(id);
element.sendKeys(inputValue);
sleep(1000L);
} else if (isEnabledClick(element)) {
element.click();
}
}
sleep(2000L);
} catch (StaleElementReferenceException e) {
reload();
} catch (Exception e) {
log.error("error:" + e.getMessage());
}
}
private void checkPage() {
boolean pageChange = !Objects.equals(currentUrl, driver.getCurrentUrl());
if (pageChange) {
boolean newPage = !historyUrls.contains(driver.getCurrentUrl());
if (newPage) {
urlQueue.add(driver.getCurrentUrl());
}
reload();
}
}
private void checkWindow() {
if (!windowQueue.isEmpty()) {
windowQueue = Queues.newLinkedBlockingQueue(driver.getWindowHandles());
}
}
private void reload() {
driver.get(currentUrl);
getAllElements(driver);
traversal();
}
private void sleep(Long time) {
try {
Thread.sleep(time);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
private void getAllElements(WebDriver driver) {
elements.clear();
driver.findElements(By.xpath("*"))
.forEach(this::getSubElements);
}
private void getSubElements(WebElement element) {
try {
List<WebElement> results = element.findElements(By.xpath("*"));
if (results.isEmpty()) {
elements.add(element);
} else {
results.forEach(this::getSubElements);
}
} catch (StaleElementReferenceException e){
}
}
private Boolean isEnabledInput(WebElement element) {
return Objects.equals(element.getTagName(), INPUT);
}
private Boolean isEnabledClick(WebElement element) {
return Objects.equals(element.getTagName(), BUTTON) || Objects.equals(element.getTagName(), A);
}
private Boolean isEnabledAndDisplayed(WebElement element) {
return element.isEnabled() && element.isDisplayed();
}
//
// Setter
//
public void setDriver(WebDriver driver) {
this.driver = driver;
}
public void setInputs(Map<String, String> inputs) {
this.inputs = inputs;
}
}
package com.zjty.autotest.service;
import org.springframework.stereotype.Service;
@SuppressWarnings("SpringJavaAutowiredFieldsWarningInspection")
@Service
public class TransHelper {
}
package com.zjty.autotest.util;
import lombok.extern.slf4j.Slf4j;
import java.io.*;
import java.nio.charset.StandardCharsets;
/**
* <p>Description : measurement
* <p>Date : 2020/1/16 15:27
* <p>@author : C
*/
@Slf4j
public class FileUtil {
private final static String WORK_PATH = System.getProperty("user.dir") + "\\";
public static void output(String text, OutputStream os) {
byte[] buffer = new byte[1024];
InputStream is = null;
BufferedInputStream bis = null;
try {
is = new ByteArrayInputStream(text.getBytes(StandardCharsets.UTF_8));
bis = new BufferedInputStream(is);
int i = bis.read(buffer);
while (i != -1) {
os.write(buffer, 0, i);
i = bis.read(buffer);
}
} catch (Exception e) {
log.error("error:" + e);
} finally {
if (bis != null) {
try {
bis.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (is != null) {
try {
is.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
package com.zjty.autotest.util;
import org.openqa.selenium.*;
import java.io.File;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
public class JavaEncapsulationUtil {
public static String getCurrentSystemTime() {
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH-mm-ss");
return dateFormat.format(new Date());
}
public static void errorScreenshot(WebDriver driver, String path, String pictureFormat) throws IOException {
String systemTime = JavaEncapsulationUtil.getCurrentSystemTime();
String pictureName = systemTime + pictureFormat;
File jpg = ((TakesScreenshot) driver).getScreenshotAs(OutputType.FILE);
}
public static WebElement elementException(WebDriver driver, By by, String elementName, String className) throws Exception {
try {
WebElement element = driver.findElement(by);
element.isDisplayed();
System.out.println(elementName + "元素存在");
return element;
} catch (Exception e) {
System.out.println(elementName + "元素不存在,浏览器关闭,请查看截图并查找原因");
throw (e);
}
}
}
package com.zjty.autotest.util;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.google.common.collect.Lists;
import java.util.List;
/**
* @author C
*/
public final class JsonUtil {
private static ObjectMapper objectMapper;
/**
* 使用泛型方法,把json字符串转换为相应的JavaBean对象。
* (1)转换为普通JavaBean:readValue(json,Student.class)
* (2)转换为List,如List<Student>,将第二个参数传递为Student
* [].class.然后使用Arrays.asList();方法把得到的数组转换为特定类型的List
*/
public static <T> T readValue(String jsonStr, Class<T> valueType) {
if (objectMapper == null) {
objectMapper = new ObjectMapper();
}
try {
return objectMapper.readValue(jsonStr, valueType);
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
/**
* 转换为指定类型的集合
*
* @param jsonStr 待转换的json字符串
* @param valueType 指定类型的Class对象
* @return 指定类型的集合
*/
public static <T> List<T> readValueToList(String jsonStr, Class<T> valueType) {
T[] arrays = readValue(jsonStr, new TypeReference<T[]>() {
});
List<T> list = Lists.newArrayList();
if (arrays != null) {
list = Lists.newArrayList(arrays);
}
return list;
}
/**
* json数组转List
*
* @param jsonStr 待转换的json字符串
* @param valueTypeRef 指定类型的Class对象
* @return 指定类型的集合
*/
public static <T> T readValue(String jsonStr, TypeReference<T> valueTypeRef) {
if (objectMapper == null) {
objectMapper = new ObjectMapper();
}
try {
return objectMapper.readValue(jsonStr, valueTypeRef);
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
/**
* 把JavaBean转换为json字符串
*/
public static String toJSon(Object object) {
if (objectMapper == null) {
objectMapper = new ObjectMapper();
}
try {
return objectMapper.writeValueAsString(object);
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
}
package com.zjty.autotest.util;
import com.zjty.autotest.common.action.Browser;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.openqa.selenium.ie.InternetExplorerDriver;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Objects;
public class WebDriverUtil {
private static final Logger logger = LoggerFactory.getLogger(WebDriverUtil.class);
/* 公共的 */
public final static String CHROME_EXE = System.getProperty("user.dir") + "\\chromedriver.exe";
public final static String FIRE_FOX_EXE = System.getProperty("user.dir") + "\\geckodriver.exe";
public final static String IE_EXE = System.getProperty("user.dir") + "\\IEDriverServer.exe";
public static WebDriver getWebDriver(String browser) {
if (Objects.equals(browser, Browser.FIREFOX)) {
System.setProperty("webdriver.firefox.driver", WebDriverUtil.FIRE_FOX_EXE);
return new FirefoxDriver();
} else if (Objects.equals(browser, Browser.CHROME)) {
System.setProperty("webdriver.chrome.driver", WebDriverUtil.CHROME_EXE);
return new ChromeDriver();
} else if (Objects.equals(browser, Browser.IE)) {
System.setProperty("webdriver.ie.driver", WebDriverUtil.IE_EXE);
return new InternetExplorerDriver();
} else {
throw new RuntimeException("该浏览器不存在:" + browser);
}
}
/**
* 结束所有残留进程
*
* @param
*/
public static void killSelenium() {
String[] pss = new String[]{
"chromedriver*",// google驱动
"IEDriver*",// IE 驱动
"geckodriver*",// Firefox 驱动
"operadriver*"// opera 驱动
};
for (String p1 : pss) {
kill_process(p1);
}
}
/**
* 结束残留进程
*
* @param s
*/
public static void kill_process(String s) {
try {
Runtime runtime = Runtime.getRuntime();
runtime.exec("taskkill /f /t /im " + s);
} catch (Exception e) {
logger.error("结束进程失败!进程名:" + s + "" + e.getMessage(), e);
}
}
/**
* 获取当前日期和时间
*
* @return
*/
public static String getNowDateTimeByFormat(String formatString) {
if (null == formatString) {
formatString = "yyyy-MM-dd HH:mm:ss";
}
return new SimpleDateFormat(formatString).format(new Date());
}
}
<!DOCTYPE html><html lang=en><head><meta charset=utf-8><meta http-equiv=X-UA-Compatible content="IE=edge"><meta name=viewport content="width=device-width,initial-scale=1"><link rel=icon href=favicon.ico><title>adapter</title><link href=static/css/serviceConfig.c2069076.css rel=prefetch><link href=static/js/serviceConfig.f214e3f3.js rel=prefetch><link href=static/css/app.f596fcc9.css rel=preload as=style><link href=static/css/chunk-vendors.717c90ab.css rel=preload as=style><link href=static/js/app.4f323ca6.js rel=preload as=script><link href=static/js/chunk-vendors.5f648e7a.js rel=preload as=script><link href=static/css/chunk-vendors.717c90ab.css rel=stylesheet><link href=static/css/app.f596fcc9.css rel=stylesheet></head><body><noscript><strong>We're sorry but adapter doesn't work properly without JavaScript enabled. Please enable it to continue.</strong></noscript><div id=app></div><script src=static/js/chunk-vendors.5f648e7a.js></script><script src=static/js/app.4f323ca6.js></script></body></html>
\ No newline at end of file
This source diff could not be displayed because it is too large. You can view the blob instead.
.horLine[data-v-065e24b9]{width:86vh;height:6px;background:rgba(72,170,253,.1)}.middleConfig[data-v-065e24b9]{height:100%;text-align:left;background-color:rgba(3,110,183,.1)}.middleConfig-left[data-v-065e24b9]{border-right:6px solid rgba(72,170,253,.1);height:74vh}.middleConfig-left>ul[data-v-065e24b9]{padding:20px 20px 0 20px}.middleConfig-left>ul>li[data-v-065e24b9]{margin:0 0 20px 0;border-bottom:4px solid rgba(72,170,253,.1)}.middleConfig-left>ul>li>i[data-v-065e24b9]{display:inline-block;width:5px;height:5px;border-radius:50%;background:#999;margin:3px 5px 3px 0}.middleLi[data-v-065e24b9]:hover{color:#59f9f7;border-bottom:4px solid #59f9f7}.middleLi[data-v-065e24b9]{color:#fff;border-bottom:4px solid rgba(72,170,253,.1)}.middleActive[data-v-065e24b9]{color:#59f9f7!important;border-bottom:4px solid #59f9f7!important}.cancel[data-v-065e24b9]{display:inline-block;width:15px;height:15px;background:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA8AAAAPCAYAAAA71pVKAAAACXBIWXMAAAsSAAALEgHS3X78AAAAtElEQVQoz6WTsQ3CMBBFn691403ICKwBUki8WCBuWIMRoGGOFKE+GgeFYOwgTnJz0nu++5bN2NUOuABX60PLinocDyfAyazXxOYasAEGsT4MwBa4lQQzsLc+tAKwRrAEAV5j5wQpEMCo6vKGKcAN0E95LMEknBCQAt/Gnldc4V5KXjKp7oBzLkQppLq3PlRx9w+BlJ4jrtGmBFICcwKjqkXw23Tmj49RoaqMXe1UlV/O2NXuCaHNppoc5cnEAAAAAElFTkSuQmCC) no-repeat;position:relative;left:220px}.middleConfig-left>p[data-v-065e24b9]{position:absolute;bottom:20px;height:60px;border-top:6px solid rgba(72,170,253,.1);width:28%}.middleConfig-left>p>span[data-v-065e24b9]{display:inline-block;margin:0 auto;width:110px;height:33px;font-size:16px;color:#fff;text-align:center;line-height:33px;background:url(data:image/png;base64,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) no-repeat;margin:20px}.middleConfig-left>p>span[data-v-065e24b9]:hover{background:url(data:image/png;base64,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) no-repeat}.middleConfig-right[data-v-065e24b9]{margin:10px 20px}.middleConfig-right>div[data-v-065e24b9]{background-color:rgba(1,13,25,.5)}.middleConfig-right>div>ul[data-v-065e24b9]{padding:0 20px}.middleConfig-right>p[data-v-065e24b9]{font-size:18px;color:#59f9f7}.middleConfig-right>p>i[data-v-065e24b9]{display:inline-block;width:5px;height:5px;background:#59f9f7;margin:4px 3px}.right-base[data-v-065e24b9]{width:100%;height:126px;font-size:16px;color:#fff}.right-base>span[data-v-065e24b9]{display:inline-block;margin:22px 70px}.right-base>span>p[data-v-065e24b9]{padding:9px 0}.right-base>span>p>span[data-v-065e24b9]{color:#59f9f7}.right-system[data-v-065e24b9]{margin-left:60px;position:relative;top:-47px}.right-system>img[data-v-065e24b9]{float:right;margin:-30px 10px 48px 0}.middleConfig-right>div>ul>li[data-v-065e24b9]{height:74px;border-bottom:6px solid rgba(72,170,253,.1)}.middleConfig-right>div>ul>li[data-v-065e24b9]:hover{border-bottom:6px solid #59f9f7}.right-system>p[data-v-065e24b9]{color:#999;font-size:14px}.right-system>p>span[data-v-065e24b9]{color:#59f9f7}
\ No newline at end of file
.serveHt[data-v-58745026]{background:rgba(72,170,253,.1);height:86vh}.serveHt .pageing[data-v-58745026]{position:absolute;right:50px;bottom:100px}.serveHt[data-v-58745026] .el-form-item__content{width:280px}.serveHt[data-v-58745026] .el-form-item.test .el-form-item__content{width:600px}.serveHt[data-v-58745026] .el-input--suffix .el-input__inner{padding-right:90px}.serveHt[data-v-58745026] .el-card{width:70%;padding:0;border-radius:0;background-color:transparent}.serveHt[data-v-58745026] .el-card__body{padding:0;background-color:transparent;height:650px}.serveHt[data-v-58745026] .el-card__body .el-select{float:left;margin-top:20px}.serveHt[data-v-58745026] .el-table{width:290px;float:left}.serveHt .chorme[data-v-58745026]{float:left;display:block;text-align:left;width:100%;margin-top:20px;margin-left:15px;color:#fff}.serveHt[data-v-58745026] .el-menu{background-color:transparent}.serveHt[data-v-58745026] .el-dialog__footer{position:absolute;right:30px;bottom:30px}.serveHt[data-v-58745026] .el-menu-item{background-color:transparent}.serveHt[data-v-58745026] .el-menu-item.is-active{color:#fff;background-color:transparent}.el-menu--horizontal>.el-menu-item[data-v-58745026]:not(.is-disabled):hover,.el-menu--horizontal>.el-submenu .el-submenu__title[data-v-58745026]:hover,.serveHt[data-v-58745026] .el-menu--horizontal>.el-menu-item:not(.is-disabled):focus{background-color:transparent}.serveHt[data-v-58745026] .el-table__body-wrapper::-webkit-scrollbar{height:6px}.serveHt[data-v-58745026] .el-table__body-wrapper::-webkit-scrollbar-thumb{background-color:rgba(13,121,194,.753);border-radius:3px}.serveHt[data-v-58745026] .serve-button{position:absolute;bottom:150px;left:50%}.serveHt[data-v-58745026] .el-icon-close:before{display:none}.serveHt[data-v-58745026] .dialog-footer{margin-bottom:20px}@media screen and (min-width:1366px){.serveHt[data-v-58745026] .el-card{width:70%;padding:0;border-radius:0;background-color:transparent}.serveHt[data-v-58745026] .serve-button{position:absolute;bottom:50px;left:50%}.serveHt[data-v-58745026] .is-scrolling-none{height:100px}}
\ No newline at end of file
.serveHt[data-v-5dab1019]{background:rgba(72,170,253,.1);height:86vh}.serveHt .button-img[data-v-5dab1019]{width:30px;height:30px;cursor:pointer}.serveHt .button-img.del[data-v-5dab1019]{float:right}.serveHt .button-img.detail[data-v-5dab1019]{width:35px;height:35px}.serveHt .pageing[data-v-5dab1019]{position:absolute;right:50px;bottom:100px}.serveHt[data-v-5dab1019] .el-form-item__content{width:280px}.serveHt[data-v-5dab1019] .el-form-item.test .el-form-item__content{width:600px}.serveHt[data-v-5dab1019] .el-input--suffix .el-input__inner{padding-right:90px}.serveHt[data-v-5dab1019] .case-table{float:right;width:20%}.serveHt[data-v-5dab1019] .el-card{width:65%;border:none;padding:0;float:left;border-radius:0;background-color:transparent}.serveHt[data-v-5dab1019] .el-card__body{padding:0;background-color:transparent;height:650px}.serveHt[data-v-5dab1019] .btn-next,.serveHt[data-v-5dab1019] .btn-prev,.serveHt[data-v-5dab1019] .el-pagination.is-background .el-pager li{background-color:transparent}.serveHt[data-v-5dab1019] .edit-txt span{color:#fff;margin-right:15px;line-height:30px}.serveHt[data-v-5dab1019] .edit-txt{float:left;margin-left:20px;margin-top:10px;cursor:pointer}.serveHt[data-v-5dab1019] .el-button.downtest{display:block;margin-bottom:10px;margin-left:10px}.serveHt[data-v-5dab1019] .el-card__body .el-select{float:left;margin-top:20px}.serveHt[data-v-5dab1019] .el-table{width:290px;float:left}.serveHt .chorme[data-v-5dab1019]{float:left;display:block;text-align:left;width:100%;margin-top:20px;margin-left:15px;color:#fff}.serveHt[data-v-5dab1019] .el-menu{background-color:transparent}.serveHt[data-v-5dab1019] .el-dialog__footer{position:absolute;right:30px;bottom:30px}.serveHt[data-v-5dab1019] .el-menu-item{background-color:transparent}.serveHt[data-v-5dab1019] .el-menu-item.is-active{color:#fff;background-color:transparent}.el-menu--horizontal>.el-menu-item[data-v-5dab1019]:not(.is-disabled):hover,.el-menu--horizontal>.el-submenu .el-submenu__title[data-v-5dab1019]:hover,.serveHt[data-v-5dab1019] .el-menu--horizontal>.el-menu-item:not(.is-disabled):focus{background-color:transparent}.serveHt[data-v-5dab1019] .el-table__body-wrapper::-webkit-scrollbar{height:6px}.serveHt[data-v-5dab1019] .el-table__body-wrapper::-webkit-scrollbar-thumb{background-color:rgba(13,121,194,.753);border-radius:3px}.serveHt[data-v-5dab1019] .serve-button{position:absolute;bottom:150px;left:50%;margin-left:-20px}.serveHt[data-v-5dab1019] .el-icon-close:before{display:none}.serveHt[data-v-5dab1019] .dialog-footer{margin-bottom:20px}@media screen and (min-width:1200px) and (max-width:1600px){.serveHt .pageing[data-v-5dab1019]{position:absolute;right:50px;bottom:40px}.serveHt[data-v-5dab1019] .el-card{width:55%;padding:0;float:left;border-radius:0;background-color:transparent}.serveHt[data-v-5dab1019] .serve-button{position:absolute;bottom:80px;left:50%;margin-left:-20px}.serveHt[data-v-5dab1019] .is-scrolling-none{height:100px}.serveHt[data-v-5dab1019] .case-table{float:right;width:290px}}
\ No newline at end of file
.serveHt[data-v-0e820d66]{background:rgba(72,170,253,.1);height:86vh}.serveHt .pageing[data-v-0e820d66]{position:absolute;right:50px;bottom:100px}.serveHt[data-v-0e820d66] .el-form-item__content{width:280px}.serveHt[data-v-0e820d66] .el-form-item.test .el-form-item__content{width:600px}.serveHt[data-v-0e820d66] .el-input--suffix .el-input__inner{padding-right:90px}.serveHt[data-v-0e820d66] .el-card{width:70%;padding:0;border-radius:0;background-color:transparent}.serveHt[data-v-0e820d66] .el-card__body{padding:0;background-color:transparent;height:650px}.serveHt[data-v-0e820d66] .el-card__body .el-select{float:left;margin-top:20px}.serveHt[data-v-0e820d66] .el-table{width:290px;float:left}.serveHt .chorme[data-v-0e820d66]{float:left;display:block;text-align:left;width:100%;margin-top:20px;margin-left:15px;color:#fff}.serveHt[data-v-0e820d66] .el-menu{background-color:transparent}.serveHt[data-v-0e820d66] .el-dialog__footer{position:absolute;right:30px;bottom:30px}.serveHt[data-v-0e820d66] .el-menu-item{background-color:transparent}.serveHt[data-v-0e820d66] .el-menu-item.is-active{color:#fff;background-color:transparent}.el-menu--horizontal>.el-menu-item[data-v-0e820d66]:not(.is-disabled):hover,.el-menu--horizontal>.el-submenu .el-submenu__title[data-v-0e820d66]:hover,.serveHt[data-v-0e820d66] .el-menu--horizontal>.el-menu-item:not(.is-disabled):focus{background-color:transparent}.serveHt[data-v-0e820d66] .el-table__body-wrapper::-webkit-scrollbar{height:6px}.serveHt[data-v-0e820d66] .el-table__body-wrapper::-webkit-scrollbar-thumb{background-color:rgba(13,121,194,.753);border-radius:3px}.serveHt[data-v-0e820d66] .serve-button{position:absolute;bottom:150px;left:50%}.serveHt[data-v-0e820d66] .el-icon-close:before{display:none}@media screen and (min-width:1366px){.serveHt[data-v-0e820d66] .el-card{width:70%;padding:0;border-radius:0;background-color:transparent}.serveHt[data-v-0e820d66] .serve-button{position:absolute;bottom:50px;left:50%}.serveHt[data-v-0e820d66] .is-scrolling-none{height:100px}}
\ No newline at end of file
.serveHt[data-v-5d0bbc7c]{background:rgba(72,170,253,.1);height:86vh}.serveHt .button-img[data-v-5d0bbc7c]{width:30px;height:30px;cursor:pointer}.serveHt .button-img.del[data-v-5d0bbc7c]{float:right}.serveHt .button-img.detail[data-v-5d0bbc7c]{width:35px;height:35px}.serveHt .pageing[data-v-5d0bbc7c]{position:absolute;right:50px;bottom:100px}.serveHt[data-v-5d0bbc7c] .el-form-item__content{width:280px}.serveHt[data-v-5d0bbc7c] .el-form-item.test .el-form-item__content{width:600px}.serveHt[data-v-5d0bbc7c] .el-input--suffix .el-input__inner{padding-right:90px}.serveHt[data-v-5d0bbc7c] .case-table{float:right;width:20%}.serveHt[data-v-5d0bbc7c] .el-card{width:65%;border:none;padding:0;float:left;border-radius:0;background-color:transparent}.serveHt[data-v-5d0bbc7c] .el-card__body{padding:0;background-color:transparent;height:650px}.serveHt[data-v-5d0bbc7c] .btn-next,.serveHt[data-v-5d0bbc7c] .btn-prev,.serveHt[data-v-5d0bbc7c] .el-pagination.is-background .el-pager li{background-color:transparent}.serveHt[data-v-5d0bbc7c] .edit-txt span{color:#fff;margin-right:15px;line-height:30px}.serveHt[data-v-5d0bbc7c] .edit-txt{float:left;margin-left:20px;margin-top:10px;cursor:pointer}.serveHt[data-v-5d0bbc7c] .el-button.downtest{display:block;margin-bottom:10px;margin-left:10px}.serveHt[data-v-5d0bbc7c] .el-card__body .el-select{float:left;margin-top:20px}.serveHt[data-v-5d0bbc7c] .el-table{width:290px;float:left}.serveHt .chorme[data-v-5d0bbc7c]{float:left;display:block;text-align:left;width:100%;margin-top:20px;margin-left:15px;color:#fff}.serveHt[data-v-5d0bbc7c] .el-menu{background-color:transparent}.serveHt[data-v-5d0bbc7c] .el-dialog__footer{position:absolute;right:30px;bottom:30px}.serveHt[data-v-5d0bbc7c] .el-menu-item{background-color:transparent}.serveHt[data-v-5d0bbc7c] .el-menu-item.is-active{color:#fff;background-color:transparent}.el-menu--horizontal>.el-menu-item[data-v-5d0bbc7c]:not(.is-disabled):hover,.el-menu--horizontal>.el-submenu .el-submenu__title[data-v-5d0bbc7c]:hover,.serveHt[data-v-5d0bbc7c] .el-menu--horizontal>.el-menu-item:not(.is-disabled):focus{background-color:transparent}.serveHt[data-v-5d0bbc7c] .el-table__body-wrapper::-webkit-scrollbar{height:6px}.serveHt[data-v-5d0bbc7c] .el-table__body-wrapper::-webkit-scrollbar-thumb{background-color:rgba(13,121,194,.753);border-radius:3px}.serveHt[data-v-5d0bbc7c] .serve-button{position:absolute;bottom:150px;left:50%;margin-left:-20px}.serveHt[data-v-5d0bbc7c] .el-icon-close:before{display:none}.serveHt[data-v-5d0bbc7c] .dialog-footer{margin-bottom:20px}@media screen and (min-width:1200px) and (max-width:1600px){.serveHt .pageing[data-v-5d0bbc7c]{position:absolute;right:50px;bottom:40px}.serveHt[data-v-5d0bbc7c] .el-card{width:55%;padding:0;float:left;border-radius:0;background-color:transparent}.serveHt[data-v-5d0bbc7c] .serve-button{position:absolute;bottom:80px;left:50%;margin-left:-20px}.serveHt[data-v-5d0bbc7c] .is-scrolling-none{height:100px}.serveHt[data-v-5d0bbc7c] .case-table{float:right;width:290px}}
\ No newline at end of file
差异被折叠。
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论