Galen test on mobile devices using WebDriver

515 views Asked by At

I'm writing a code using Cucumber with Selenium WebDriver. I can start the Galen framework tests using Webdriver and everything is passed to default, desktop size (when the window is maximized). I tried to change the size to a mobile one. I reviewed the documentation, in JS I found:

 this.devices = {
   mobile: {
    deviceName: "mobile",
    size: "400x700"
  },
  tablet: {
    deviceName: "tablet",
    size: "600x800"
  },
  desktop: {
    deviceName: "desktop",
    size: "1024x768"
  }
};

http://galenframework.com/docs/reference-javascript-tests-guide/#Usingstructures

But I can't find something similar on the basics: http://galenframework.com/docs/reference-galen-spec-language-guide/ I started to find a workaround by setting before layout check out the size of the browser - it works, the size of the page is changed, but Galen framework does not see @on mobile should be done on mobile.

My code so far (removed unnecessary parts):

Steps.feature:

Feature: First step for regression tests
  Scenario: Opening the form
    Given Open the Firefox and launch the application
    Given Set size the browser to "desktop"
    When Login page is opened
    When Enter the Username "foo" and Password "abcd"
    Then I check layout on "desktop"
    Given Set size the browser to "mobile"
    Then I check layout on "mobile"
    Then I log out

Steps.java:

public class Steps {

private WebDriver driver;
private String device ="";

@Given("^Open the Firefox and launch the application$")
public void open_the_Firefox_and_launch_the_application() throws Throwable
{
    System.setProperty("webdriver.gecko.driver", System.getProperty("user.dir") + "\\geckodriver.exe");
    driver= new FirefoxDriver();
    driver.manage().window().maximize();
}

@Given("^Set size the browser to \"([^\"]*)\"$")
public void resizeBrowser(String device) throws Throwable {
    if (device.equals("desktop")) {
        System.setProperty(device, "desktop");
        driver.manage().window().maximize();
    }
    else if (device.equals("mobile")) {
        System.setProperty(device, "mobile");
        driver.manage().window().setPosition(new Point(0,0));
        driver.manage().window().setSize(new Dimension(400,700));
    }
    else if (device.equals("tablet")){
        System.setProperty(device, "tablet");
        driver.manage().window().setPosition(new Point(0,0));
        driver.manage().window().setSize(new Dimension(800,600));
    }
}

@When("^Login page is opened$")
public void openingLoginPage() throws Throwable {
    driver.get("foo");
}

@When("^Enter the Username \"(.*)\" and Password \"(.*)\"$")
public void enter_the_Username_and_Password(String username,String password) throws Throwable
{
    driver.findElement(By.name("login")).sendKeys(username);
    driver.findElement(By.name("password")).sendKeys(password);
    driver.findElement(By.cssSelector("input[type=submit]")).click();
}

@Then("^I check layout on \"(.*)\"$")
public void DesignCheck() throws Throwable {
    Helper.confirmationEmailPageLayoutTest(driver, device);
}

@When("^I log out$")
public void logOut() throws Throwable {
    Helper.logOut(driver);
}
}

Helper method, which runs the Galen tests

public static void confirmationEmailPageLayoutTest(WebDriver driver, String device) throws IOException {
    //Create a layoutReport object
    //checkLayout function checks the layout and returns a LayoutReport object
    String pathToSpecs = "/src/galenTests/URF.gspec";
    if (System.getProperty("os.name").toLowerCase().contains("win")) {
        pathToSpecs = "src\\galenTests\\URF.gspec";
    }
    LayoutReport layoutReport = Galen.checkLayout(driver, pathToSpecs, Arrays.asList(device));

    //Create a tests list
    List<GalenTestInfo> tests = new LinkedList<>();

    //Create a GalenTestInfo object
    GalenTestInfo test = GalenTestInfo.fromString("confirmation email layout");

    //Get layoutReport and assign to test object
    test.getReport().layout(layoutReport, "check confirmation email layout");

    //Add test object to the tests list
    tests.add(test);

    //Create a htmlReportBuilder object
    HtmlReportBuilder htmlReportBuilder = new HtmlReportBuilder();

    //Create a report under /target folder based on tests list
    htmlReportBuilder.build(tests, "target");

    //If layoutReport has errors Assert Fail
    if (layoutReport.errors() > 0) {
        Assert.fail("Layout test failed");
    }
}

Gspec file:

@objects
  header css .container-fluid
  titlebar id call-details-header
    text h1
    clearbtn a
        image img
        text span
PageFForm id tmpComponent(...)

@on mobile, desktop
= header =
    header:
        height > 20 px
        width ~ 98 % of screen/width
    = titlebar =
titlebar:(...)
= Page =
PageFForm:
    height > 3000 px
PageFForm.allsections:(...)

@on desktop
= titlebar =
titlebar.text:
    height < 50 px
= Page =
PageFForm:
    width 75 to 95% of screen/width

@on mobile
= titlebar =
titlebar.text:
    height < 100 px
= Page =
PageFForm:
    width ~98% of screen/width

Test result:

"PageFForm" width is 90% [1170px] which is not in range of 96 to 100% [1235 to 1287px]
1

There are 1 answers

0
Bender On

you might want to pass device properly to your helper method:

@Then("^I check layout on \"(.*)\"$")
public void DesignCheck() throws Throwable {
    Helper.confirmationEmailPageLayoutTest(driver, System.getProperty(device));
}

below line takes list of tags (any, e.g. browser name, your device name, additional tag name, myTagName)

LayoutReport layoutReport = Galen.checkLayout(driver, pathToSpecs, Arrays.asList(device, myTagName));

which means in your spec then, galen knows which rule/check to use e.g. @on myTagName