【问题标题】:Variables from properties.file not being passed - TestNG - WebDriver Testproperties.file 中的变量未通过 - TestNG - WebDriver Test
【发布时间】:2014-06-04 22:00:23
【问题描述】:

我正在使用 Webdriver + TestNG。我创建了一个类,您可以在其中使用您选择的浏览器运行任何测试,只需使用下面的方法,您可以在其中输入要运行的浏览器以及要运行的测试作为变量。现在我正在尝试从属性文件中提供我的“浏览器”变量和“测试”变量。当我运行它时,我只是获得了通行证,但没有任何反应。如果我手动输入变量,它工作正常。为什么它不会从属性文件中获取值?如果我进行打印 - 它会打印正确的值...

这是属性文件的内容:

browser="浏览器到这里"

test="测试到这里"

这是我运行测试的方法:

@Test
        public void runTest() throws IOException {
            Properties prop = new Properties();
            prop.load(new FileInputStream(
                    "path\\test.properties"));
            localBrowser(prop.getProperty("browser"));
            masterTest(driver, prop.getProperty("test"));
        }

这是我测试的沙盒示例:

如果我将变量放入我自己,浏览器将打开并执行测试。如果我使用属性加载器,它只会打印变量但不会运行测试。这是一个沙盒示例,您可以尝试一下。

包结构:

-src/test/java
--沙盒测试
-src/test/资源
--test.properties

属性文件示例:

浏览器=火狐
测试=测试1

类示例:

公共类 SandboxTest {

private WebDriver driver;
InputStream input = null;
Properties prop = new Properties();

@Test
public void runTest() throws FileNotFoundException, IOException {
        input = new FileInputStream(
                (new File(
                    "C:INSERT_PATH_HERE\\test.properties")));
        prop.load(input);
            //This doesnt run the test
        System.out.println(prop.getProperty("browser"));
        System.out.println(prop.getProperty("test"));
        localBrowser(prop.getProperty("browser"));
        masterTest(driver, prop.getProperty("test"));
        /* 
         * This works
                 * localBrowser("firefox");
         * masterTest(driver, "test1");
         */


}

public void localBrowser(String browser) {
    if (browser == "firefox") {
        driver = new FirefoxDriver();
    } else if (browser == "chrome") {
        System.setProperty("webdriver.chrome.driver",
                "C:\\INSERT_PATH_HERE\\chromedriver.exe");
        driver = new ChromeDriver();
    } else if (browser == "ie") {
        System.setProperty("webdriver.ie.driver",
                "C:\\INSERT_PATH_HERE\\IEDriverServer.exe");
        driver = new InternetExplorerDriver(caps);
    }
}

public void masterTest(WebDriver driver, String test) {
    if (test == "test1") {
        Test1(driver);
    } else if (test == "test2") {
        Test2(driver);
    }
}

// *********************************TESTS*****************************************************

public void Test1(WebDriver driver) {
    driver.get("http://www.marca.com/en/");
    driver.findElement(By.linkText("Barcelona")).click();
}

public void Test2(WebDriver driver) {
    driver.get("http://www.marca.com");
    driver.findElement(By.linkText("Fútbol")).click();
}

}

【问题讨论】:

  • 你是说如果你打印这个 prop.getProperty("browser") 它会打印值但不会传递给函数??
  • 正确@Aviad。如果我将浏览器属性设置为 firefox (browser=firefox) 并执行 System.out.println(prop.getProperty("browser"));我会得到 Firefox,但是当我做 localBrowser(prop.getProperty("browser"));我什么都得不到。如果我在这样的方法中传递浏览器,它可以工作 localBrowser("firefox")。
  • 如果我理解正确,你可以在属性文件中设置 browser=firefox 并且它可以工作。所以我不明白,因为你仍然有问题 :) 你能告诉我你的结构吗项目也,文件加载正确?
  • @Aviad 我的意思是它不能将它作为变量传递,但如果我执行 sysout,我会从属性文件中看到该变量。这有意义吗?
  • @seleniumRookie - 执行 System.out.println(prop.getProperty("SDf")) 或执行 localBrowser(prop.getProperty("SDf") 时行为不会有差异)。问题似乎出在其他地方。输入 localBrowser 的代码。在 localBrowser 中打印 browser 的值以及在调用之前并共享输出

标签: java testng


【解决方案1】:

嗯..我真的不确定你在做什么,但如果它不起作用,那么它可能无法正确加载属性文件。

试试这个

Resource resource = new ClassPathResource("/environment.properties");
properties = PropertiesLoaderUtils.loadProperties(resource);

告诉我是否可以,希望对您有所帮助

编辑:

以上是Spring的一部分, 你可以使用

prop.load(new FileInputStream(new File("test.properties")));
  • 请确保 test.properties 在项目的 src 文件夹下

编辑:

问题不在属性文件中。问题在于您比较 2 个字符串的方式

当您执行browser == "firefox" 时,检查对象地址(referenec) 当您比较对象类型时,您需要使用 Eqauls 例如browser.equals("firefox") 它会这样工作。

因为当您输入自己的值时,它会检查引用并且它是相同的。一旦您从属性中获得,这是 2 个不同的对象,但它们是“相等的”所以它只适用于 Equals

【讨论】:

  • ClassPathResource 好像是spring框架的方法……对吗?
  • 是的,不相关?您可以使用其他方法.. 我编辑我的答案
  • 还是一样。如果我执行 sysout,我会在控制台中看到变量,但它们仍然没有传递给方法。
  • 请用其他示例编辑您的问题。显示项目雇佣关系并显示 test.proprties 文件的位置。另外创建示例并显示它打印的内容。只有一个带有 print+ 调用 localBrowser 方法的 main,如果您可以添加此方法的实现
  • 我添加了一个“沙盒”示例,你可以看看。
【解决方案2】:

您应该做的是放入the property in the testing.xml 文件,然后从那里读取属性。然后,如果您需要不同的属性文件,您可以创建多个 testing.xml 文件,并且在执行测试时只需将 testng.xml 文件作为参数传递给 TestNG。

在我上面在超链接中引用的项目中,您可以看到我引用了类似这样的属性:

@BeforeClass
public void setUp( ITestContext context ) {
    suiteParams = context.getSuite().getXmlSuite().getAllParameters();
    String browser = suiteParams.get( "browser" );
    String sauceUser = suiteParams.get( "sauceUser" );
    String sauceKey = suiteParams.get( "sauceKey" )
  ....

如果您必须使用属性文件来执行此操作,那么我会更改您的代码并以不同的方式执行。像这样(假设使用 TestNG):

protected WebDriver driver;
protected String browser;
@BeforeTest
public void setUp() {
    Properties prop = new Properties();
    prop.load( new FileInputStream("path/test.properties") );
    browser = prop.getProperty("browser");
    if ( browser.equals("firefox") {
        driver = new FirefoxDriver();
    }  else {
        driver = null; // bad choice
    }
}
@Test
public void runTest() throws IOException {
    driver.navigateTo( url);
    // do stuff
    Assert.assertTrue( 1 == 1 );
}
@AfterTest
public void cleanUp() {
    driver.quit();
}

【讨论】:

  • 属性文件是在别处生成的,所以它必须是一个属性文件。
  • 这很有趣,但我需要远离 XML,因为在这个项目之后我将不再使用 TestNG。我将从 Java 转换为 C#,并将使用我不认为具有 XML 功能的 Nunit。
  • 如果您切换到 NUnit,那么我的答案的后半部分仍然适用。您需要使用并注意单元测试的 @Before 阶段,我认为这对于 NUnit 被称为“SetUp 夹具”。就我个人而言,我不会考虑改用 NUnit,因为 TestNG 在运行并行多线程测试方面要优越得多。
  • 不幸的是,TestNG 仅适用于 Java,所以当我切换到 C# 时,我别无选择,只能停止使用 TestNG。
  • @Dror - 请参阅 TestNG 文档,第 5.18.1 节。文档有点模糊,大多数人都没有意识到你可以做到。
猜你喜欢
  • 2021-11-26
  • 2015-06-30
  • 1970-01-01
  • 1970-01-01
  • 2021-03-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-12-20
相关资源
最近更新 更多