【发布时间】:2017-10-02 12:42:37
【问题描述】:
我正在尝试从过去一周中找到解决方案,并发布了一个关于此问题的问题。
我创建了一个简单的 Maven 项目。 并编写了一个打开浏览器的功能文件,去facebook并关闭浏览器。
首先,下面是项目结构,
以下是我的功能文件。功能文件的名称是 Testing.feature
Feature: Open FB
Scenario: Open FB
Given User opens "facebookURL" on "ChromeBr"
When User is on facebook
Then close the browser
然后我为上面的特征文件写了一个stepdefinition。步骤定义文件的名称是 Testing.java
package stepDefinitions;
import cucumber.api.java.en.Given;
import cucumber.api.java.en.Then;
import cucumber.api.java.en.When;
import util.WebConnector;
public class Testing {
WebConnector wc = WebConnector.getInstance();
@Given("^User opens \"([^\"]*)\" on \"([^\"]*)\"$")
public void user_opens_on(String URL, String Browser) throws Throwable {
wc.openBrowser(Browser);
wc.navigateURL(URL);
System.out.println("Browser Opened & navigated to FB");
}
@When("^User is on facebook$")
public void user_is_on_facebook() throws Throwable {
System.out.println("User is on FB");
}
@Then("^close the browser$")
public void close_the_browser() throws Throwable {
wc.quitBrowser();
System.out.println("Browser Closed");
}
}
而 config.properties 只包含一个属性
facebookURL=https://www.facebook.com
我编写了一个通用类文件,它是 WebConnector.java,它将有一个用于初始化属性文件的构造函数和一些方法,如打开浏览器和 URL 等
package util;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.Properties;
import java.util.concurrent.TimeUnit;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
public class WebConnector {
public Properties OR = null;
public Properties CONFIG = null;
public static WebDriver driver;
static WebConnector w;
private WebConnector() {
if(CONFIG==null) {
try {
CONFIG = new Properties();
FileInputStream fis = new FileInputStream(System.getProperty("user.dir")+"\\src\\test\\java\\config\\config.properties"); **//Here only I get error when I export as Runnable Jar and Run**
CONFIG.load(fis);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
public static WebConnector getInstance() {
if(w==null)
w=new WebConnector();
return w;
}
public void openBrowser(String browserName) throws IOException {
System.setProperty("webdriver.chrome.driver", System.getProperty("user.dir")+"\\chromedriver.exe");
driver = new ChromeDriver();
driver.manage().window().maximize();
driver.manage().timeouts().implicitlyWait(20, TimeUnit.SECONDS);
}
public void navigateURL(String URL) throws IOException {
driver.get(CONFIG.getProperty(URL));
}
public void quitBrowser() {
driver.quit();
}
}
这是我的测试运行器类,它有一个 main 方法。它可以使用 Junit 以及 Java Application 运行
package util;
import org.junit.runner.JUnitCore;
import org.junit.runner.RunWith;
import cucumber.api.CucumberOptions;
import cucumber.api.junit.Cucumber;
@RunWith(Cucumber.class)
@CucumberOptions(
features = "classpath:feature",
glue = "stepDefinitions"
)
public class RunCukesTest {
public static void main(String[] args) {
JUnitCore.main("util.RunCukesTest");
}
}
Pom.xml
<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>Jar_Testing</groupId>
<artifactId>Jar_Testing</artifactId>
<version>0.0.1-SNAPSHOT</version>
<dependencies>
<!-- https://mvnrepository.com/artifact/org.seleniumhq.selenium/selenium-java -->
<dependency>
<groupId>org.seleniumhq.selenium</groupId>
<artifactId>selenium-java</artifactId>
<version>3.5.3</version>
</dependency>
<!-- https://mvnrepository.com/artifact/junit/junit -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
<!-- https://mvnrepository.com/artifact/info.cukes/cucumber-java -->
<dependency>
<groupId>info.cukes</groupId>
<artifactId>cucumber-java</artifactId>
<version>1.2.5</version>
</dependency>
<!-- https://mvnrepository.com/artifact/info.cukes/cucumber-core -->
<dependency>
<groupId>info.cukes</groupId>
<artifactId>cucumber-core</artifactId>
<version>1.2.5</version>
</dependency>
<!-- https://mvnrepository.com/artifact/info.cukes/cucumber-junit -->
<dependency>
<groupId>info.cukes</groupId>
<artifactId>cucumber-junit</artifactId>
<version>1.2.5</version>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<artifactId>maven-assembly-plugin</artifactId>
<configuration>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
<archive>
<manifest>
<mainClass>util.RunCukesTest</mainClass>
</manifest>
</archive>
</configuration>
</plugin>
</plugins>
</build>
</project>
问题: 当我使用 Junit 或 Java 应用程序运行 RunCukesTest.java 时,它运行良好。也就是打开浏览器,去fb,然后关闭浏览器。
但是当我创建一个可执行的 Jar 并运行时,它并没有按预期运行。
我按照以下步骤导出为 Runnable Jar:
1) Run--> Run Configuration--> Java Application-->New Launch Configuration-->And selects the main class as RunCukesTest.java-->Apply
2) Right click the project-->Export
3) Java--> Runnable JAR File -->Next
4) Under Launch Configuration select the RunCukesTest.java and give the export destination
5) And I have selected the option "Extract required Libraries into Jar"
5) click finish
假设我已将这个 Jar 保存在我的桌面中。桌面路径-->“C:\Users\PC\Desktop” 当我从命令提示符运行这个 Jar 时,它显示如下
C:\Users\PC\Downloads>java -jar Maven.jar
JUnit version 4.12
.java.io.FileNotFoundException: C:\Users\PC\Downloads\src\test\java\config\c
onfig.properties (The system cannot find the path specified)
at java.io.FileInputStream.open0(Native Method)
at java.io.FileInputStream.open(FileInputStream.java:195)
at java.io.FileInputStream.<init>(FileInputStream.java:138)
at java.io.FileInputStream.<init>(FileInputStream.java:93)
at util.WebConnector.<init>(WebConnector.java:19)
at util.WebConnector.getInstance(WebConnector.java:30)
at stepDefinitions.Testing.<init>(Testing.java:9)
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstruct
orAccessorImpl.java:62)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingC
onstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
at cucumber.runtime.java.DefaultJavaObjectFactory.cacheNewInstance(Defau
ltJavaObjectFactory.java:41)
at cucumber.runtime.java.DefaultJavaObjectFactory.getInstance(DefaultJav
aObjectFactory.java:33)
at cucumber.runtime.java.JavaStepDefinition.execute(JavaStepDefinition.j
ava:38)
at cucumber.runtime.StepDefinitionMatch.runStep(StepDefinitionMatch.java
:37)
at cucumber.runtime.Runtime.runStep(Runtime.java:300)
at cucumber.runtime.model.StepContainer.runStep(StepContainer.java:44)
at cucumber.runtime.model.StepContainer.runSteps(StepContainer.java:39)
at cucumber.runtime.model.CucumberScenario.run(CucumberScenario.java:44)
at cucumber.runtime.junit.ExecutionUnitRunner.run(ExecutionUnitRunner.ja
va:102)
at cucumber.runtime.junit.FeatureRunner.runChild(FeatureRunner.java:63)
at cucumber.runtime.junit.FeatureRunner.runChild(FeatureRunner.java:18)
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
at cucumber.runtime.junit.FeatureRunner.run(FeatureRunner.java:70)
at cucumber.api.junit.Cucumber.runChild(Cucumber.java:95)
at cucumber.api.junit.Cucumber.runChild(Cucumber.java:38)
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
at cucumber.api.junit.Cucumber.run(Cucumber.java:100)
at org.junit.runners.Suite.runChild(Suite.java:128)
at org.junit.runners.Suite.runChild(Suite.java:27)
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
at org.junit.runner.JUnitCore.run(JUnitCore.java:137)
at org.junit.runner.JUnitCore.run(JUnitCore.java:115)
at org.junit.runner.JUnitCore.runMain(JUnitCore.java:77)
at org.junit.runner.JUnitCore.main(JUnitCore.java:36)
at util.RunCukesTest.main(RunCukesTest.java:16)
.EEII
←[31mFailed scenarios:←[0m
←[31mfeature/Testing.feature:3 ←[0m# Scenario: Open FB
1 Scenarios (←[31m1 failed←[0m)
3 Steps (←[31m1 failed←[0m, ←[36m2 skipped←[0m)
0m0.314s
java.lang.IllegalStateException: The driver executable does not exist: C:\Users\
PC\Downloads\chromedriver.exe
at com.google.common.base.Preconditions.checkState(Preconditions.java:53
4)
at org.openqa.selenium.remote.service.DriverService.checkExecutable(Driv
erService.java:136)
at org.openqa.selenium.remote.service.DriverService.findExecutable(Drive
rService.java:131)
at org.openqa.selenium.chrome.ChromeDriverService.access$000(ChromeDrive
rService.java:32)
at org.openqa.selenium.chrome.ChromeDriverService$Builder.findDefaultExe
cutable(ChromeDriverService.java:137)
at org.openqa.selenium.remote.service.DriverService$Builder.build(Driver
Service.java:329)
at org.openqa.selenium.chrome.ChromeDriverService.createDefaultService(C
hromeDriverService.java:88)
at org.openqa.selenium.chrome.ChromeDriver.<init>(ChromeDriver.java:124)
at util.WebConnector.openBrowser(WebConnector.java:36)
at stepDefinitions.Testing.user_opens_on(Testing.java:12)
at ?.Given User opens "facebookURL" on "ChromeBr"(feature/Testing.featur
e:4)
Time: 0.359
There were 2 failures:
1) Given User opens "facebookURL" on "ChromeBr"(Scenario: Open FB)
java.lang.IllegalStateException: The driver executable does not exist: C:\Users\
PC\Downloads\chromedriver.exe
at com.google.common.base.Preconditions.checkState(Preconditions.java:53
4)
at org.openqa.selenium.remote.service.DriverService.checkExecutable(Driv
erService.java:136)
at org.openqa.selenium.remote.service.DriverService.findExecutable(Drive
rService.java:131)
at org.openqa.selenium.chrome.ChromeDriverService.access$000(ChromeDrive
rService.java:32)
at org.openqa.selenium.chrome.ChromeDriverService$Builder.findDefaultExe
cutable(ChromeDriverService.java:137)
at org.openqa.selenium.remote.service.DriverService$Builder.build(Driver
Service.java:329)
at org.openqa.selenium.chrome.ChromeDriverService.createDefaultService(C
hromeDriverService.java:88)
at org.openqa.selenium.chrome.ChromeDriver.<init>(ChromeDriver.java:124)
at util.WebConnector.openBrowser(WebConnector.java:36)
at stepDefinitions.Testing.user_opens_on(Testing.java:12)
at ?.Given User opens "facebookURL" on "ChromeBr"(feature/Testing.featur
e:4)
2) Scenario: Open FB
java.lang.IllegalStateException: The driver executable does not exist: C:\Users\
PC\Downloads\chromedriver.exe
at com.google.common.base.Preconditions.checkState(Preconditions.java:53
4)
at org.openqa.selenium.remote.service.DriverService.checkExecutable(Driv
erService.java:136)
at org.openqa.selenium.remote.service.DriverService.findExecutable(Drive
rService.java:131)
at org.openqa.selenium.chrome.ChromeDriverService.access$000(ChromeDrive
rService.java:32)
at org.openqa.selenium.chrome.ChromeDriverService$Builder.findDefaultExe
cutable(ChromeDriverService.java:137)
at org.openqa.selenium.remote.service.DriverService$Builder.build(Driver
Service.java:329)
at org.openqa.selenium.chrome.ChromeDriverService.createDefaultService(C
hromeDriverService.java:88)
at org.openqa.selenium.chrome.ChromeDriver.<init>(ChromeDriver.java:124)
at util.WebConnector.openBrowser(WebConnector.java:36)
at stepDefinitions.Testing.user_opens_on(Testing.java:12)
at ?.Given User opens "facebookURL" on "ChromeBr"(feature/Testing.featur
e:4)
FAILURES!!!
Tests run: 2, Failures: 2
我了解它正在尝试查找文件并且失败了。当我打开 Jar 时,它在下面的结构中。
如何保持相同的文件夹结构,以免出现 File Not Found Exception 或有没有其他方法可以成功运行?
【问题讨论】:
标签: java maven selenium jar cucumber