【问题标题】:Need assistance with testng/arquillian/drone/graphene and bypassing arquillian.xml在 testng/arquillian/drone/graphene 和绕过 arquillian.xml 方面需要帮助
【发布时间】:2018-05-08 13:52:23
【问题描述】:

让我设置我的测试环境。我们从命令行在虚拟机上运行我们的测试。从命令行运行 testng.xml。不能通过它传递参数。我们有一个包含所有运行时参数的 test.properties,并通过它设置浏览器类型、版本、主页 URL 等。我们目前正在使用页面对象。

我们有一个所有 pageTests 都继承自它的 functionalTest.java,它解析 test.properties 并为特定的 600 个测试运行设置所有参数。我想改用 Arquillian/Graphene/Drone,但我很难在我的环境中设置它。

我不能使用 arquillian.xml,因为每次运行都会有所不同,而且我无法为每次运行附加不同的文件。因此,我需要相信在我的functionalTest.java 中为所有内容设置系统属性。到目前为止,我已经尝试过:

// 文件:FunctionalTest.java 打包测试;

import org.jboss.arquillian.drone.api.annotation.Drone;
import org.jboss.arquillian.testng.Arquillian;
import org.openqa.selenium.WebDriver;
import org.testng.annotations.BeforeSuite;

import framework.Log;
import framework.Utility;

/**
 * FunctionalTest class contains the setup methods and these will run before or after the suite or test methods.
 *
 **/
public class FunctionalTest extends Arquillian
{
    @Drone
    public WebDriver wDriver;

    public static Properties pTestProperties = new Properties();
    public static String sBrowser = "";
    public static String sBrowserVersion = "";
    public static String sEnvironment = "";

    @BeforeSuite
    public static void StartSuite()
    {
        pTestProperties = Utility.ReadPropertiesFile("test.properties", pTestProperties);
        pTestProperties = Utility.ReadPropertiesFile("testEnvironment.properties", pTestProperties);
        sEnvironment = (System.getenv("ENVIRONMENT_NAME") != null) ? System.getenv("ENVIRONMENT_NAME") : pTestProperties.getProperty("environment");
        sBrowser = (Utility.GetTestParameterString("browser") != "") ? Utility.GetTestParameterString("browser") : pTestProperties.getProperty("browser");
        sBrowserVersion = (Utility.GetTestParameterString("browserVersion") != "") ? Utility.GetTestParameterString("browserVersion") : pTestProperties.getProperty("browserVersion");
        System.setProperty("webdriver.browser", sBrowser);
        System.setProperty("webdriver.chrome.driver", "\\drivers\\chromedriver_2.38_Win32.exe");
    }
}

// 文件:HomePageTest.java 打包测试;

import org.jboss.arquillian.container.test.api.RunAsClient;
import org.jboss.arquillian.testng.Arquillian;
import org.testng.Assert;
import org.testng.annotations.Test;

import framework.Log;
import pageobjects.HomePage;

@RunAsClient
public class HomePageTest extends FunctionalTest
{
    @Test(dataProvider = Arquillian.ARQUILLIAN_DATA_PROVIDER)
    public void OpenUrlTest()
    {
        String sUrl = "";
        HomePage oHomePage = null;
        sUrl = pTestProperties.getProperty("testUrl." + sEnvironment + "." + sTestCaseName) != null ? pTestProperties.getProperty("testUrl." + sEnvironment + "." + sTestCaseName) : pTestProperties.getProperty("testUrl." + sEnvironment + "." + sCountry);
        System.setProperty("webdriver.remoteAddress", sUrl);
        oHomePage = new HomePage(wDriver);
        wDriver.get(sUrl);
        Assert.assertTrue(oHomePage.IsLoaded());
        Log.Info("Passed");
    }

}

// 文件:HomePage.java 打包页面对象;

import java.util.concurrent.TimeUnit;

import org.jboss.arquillian.graphene.Graphene;
import org.openqa.selenium.StaleElementReferenceException;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.support.FindBy;

import framework.Log;

public class HomePage
{
    private final WebDriver driver;

    public HomePage(WebDriver driver)
    {
        this.driver = driver;
    }

    @FindBy(id = "hero-carousel")
    private WebElement homepageCarousel;

    public boolean IsLoaded()
    {
        Log.Info("Entering method HomePage::IsLoaded()");
        boolean bFlag = false;
        try
        {
            Graphene.waitGui().withMessage("Carousel not shown on HomePage").ignoring(StaleElementReferenceException.class)
                    .pollingEvery(1, TimeUnit.SECONDS).until().element(homepageCarousel).is().visible();
            bFlag = true;
        }
        catch (Exception e)
        {
            Log.Info("Execption thrown: " + e.getMessage());
            bFlag = false;
        }
        Log.Info("Exiting the method HomePage::IsLoaded() with return value: '" + bFlag + "'");
        return bFlag;
    }
}

运行 OpenUrlTest 会产生“缺少 arquillian.xml”错误。如果我放入一个 arquillian.xml,我所做的任何事情都不会覆盖浏览器类型。有什么帮助吗?

格雷格

【问题讨论】:

    标签: selenium jboss-arquillian arquillian-drone graphene2


    【解决方案1】:

    您可以在 arquillian.xml 中使用系统属性。

    例如:

    <extension qualifier="webdriver">
        <property name="browser">${browser}</property>
    </extension>
    

    通过命令行,可以传递-Dbrowser=chrome

    或者,

    您可以忽略 arquillian xml 属性并在运行时设置 arquillian 属性

    System.setProperty("arq.extension.webdriver.browser", "chrome");
    

    【讨论】:

    • 是否有任何文档详细说明可以使用 System.setProperty 设置的实际属性是什么?我试过 System.setProperty("arq.extension.webdriver.browser", "chrome"); Drone 仍然使用 firefox。
    • @Gregma。检查 arquillian 网站。他们有。但一般来说它是 arq.extension.[qualifier].[propertyname] 。所以在我们的例子中它变成了arq.extension.webdriver.browser
    • @GregMa 我注意到 Drone/Selenium 服务器有时会选择 Firefox,尽管请求(比如)IE 浏览器,如果 arquillian.xml 中列出了某些“moz:xxx”属性。我注意到,通过注释掉该属性,但不更改任何其他内容,正确的浏览器就会启动。否则,我已经成功使用 arq.extension.webdriver.browser 覆盖,但请注意,在执行以 -Darq.extension.webdriver.browser=whatever 开始之前,我在 JVM 命令行上设置它,而不是尝试在代码中进行。
    • 我希望能够做到这一点,但在我们的世界中,我们使用 ALM 来启动我们的 selenium/testng 套件。而且我们的 IT 部门不允许我们更改 JVM 命令行。因此,一切都必须在运行时完成。我检查了 arquillian.xml 以确保没有 moz:xxx 属性,即使没有 arquillian.xml 存在。很遗憾,因为这看起来很有希望。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-04
    • 2011-01-27
    • 2014-02-06
    • 2017-11-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多