Selenium Web Driver and OpenLayers 2.x: how to do a identify on a map?

811 views Asked by At

I've to test a web mapping application that use OpenLayers 2.x, using Selenium Web Driver in Java and using Firefox (I'm on Windows 7).

I've found only this issue How to use OpenLayers DrawFeature with Selenium WebDriver in Java (double click issue)? that doesn't solve my problem.

I've have to test the identify function on features on the map, so:

1) select the identify button on my toolbar (I'm able to do this ... so no problem ...)

2) click on a point feature on the map (I'm not able to do this ....)

3) close the dialog that shows the feature descriptive data (I'm not able to do this ....)

I can't give the url of my application that it's not public but I can use this simple test case

http://dev.openlayers.org/releases/OpenLayers-2.13.1/examples/markers.html

that shows my use case.

Clicking on the map, you'll see the feature details and then close the dialog.

Here you're my code that doesn't work

package myTestProjects;

import java.util.concurrent.TimeUnit;

import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.openqa.selenium.interactions.Actions;

public class identifyOpenLayersTest_02 {

private static WebDriver driver = null;

public static void main(String[] args)  throws InterruptedException {

    // Create a new instance of the Firefox driver
    System.out.println("Create a new instance of the Firefox driver ...");
    driver = new FirefoxDriver();

    //Put a Implicit wait, this means that any search for elements on the page could take the time the implicit wait is set for before throwing exception
    driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);

    // It is always advisable to Maximize the window before performing DragNDrop action
    System.out.println("Maximize the window ...");
    driver.manage().window().maximize();
    Thread.sleep(3000L);        

    // Launch the OpenLayers 2.x marker sample 
    System.out.println("Launch the OpenLayers 2.x marker sample  ...");
    Thread.sleep(3000L); 
    driver.get("http://dev.openlayers.org/releases/OpenLayers-2.13.1/examples/markers.html");

    // Create a new Action instance 
    System.out.println("Create a new Action instance ...");
    Actions act = new Actions(driver);

    // Find the viewport inside in witch there is the map   
    System.out.println("Find the viewport inside in witch there is the map ...");
    Thread.sleep(3000L);
    WebElement el = driver.findElement(By.id("OpenLayers_Map_2_OpenLayers_ViewPort"));

    // Start the action sequence 
    System.out.println("Start the action sequence  ...");
    Thread.sleep(3000L);
    act.click().perform();

    // Identify marker
    System.out.println("Identify marker at 285, 111 ...");
    Thread.sleep(3000L);
    act.moveToElement(el, 285, 111).click().build().perform();            

    // Print TEST = OK!!
    System.out.println("TEST = OK !!");
    //driver.quit();

        }
} 

Suggestions? Samples?

EDIT:
I've some news about this question (not still the solution unfortunately ....).

If you run my code using this OpenLayers sample

http://dev.openlayers.org/releases/OpenLayers-2.13.1/examples/getfeatureinfo-popup.html

you'll see that it works, so the the problem seems NOT to be about coordinates.

I think that the problem is that using this sample

http://dev.openlayers.org/releases/OpenLayers-2.13.1/examples/markers.html

the description data of the features is put in a DIV as you can see in the picture ....

enter image description here

How can I show this DIV after my click?

Any help about this?

Thank you very much in advance!!!

1

There are 1 answers

0
Cesare On BEST ANSWER

I've solved!!

Here you're the code that works!

package myTestProjects;

import java.util.concurrent.TimeUnit;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.openqa.selenium.firefox.FirefoxProfile;
import org.openqa.selenium.firefox.internal.ProfilesIni;
import org.openqa.selenium.interactions.Actions;


public class identifyOpenLayersTest_02 {

private static WebDriver driver = null;

public static void main(String[] args)  throws InterruptedException {

    //Create a new profile and load my Firefox default profile 
    System.out.println("Creo un nuovo profilo e vi carico il profilo Firefox di default ...");
    Thread.sleep(3000L);
    ProfilesIni profile = new ProfilesIni();        
    FirefoxProfile ffProfile = profile.getProfile("default");

    // Create a new instance of the Firefox driver using my new Firefox profile  
    System.out.println("Creo una nuova sessione del browser Firefox ...");
    Thread.sleep(3000L);
    driver = new FirefoxDriver(ffProfile);

    //Put a Implicit wait, this means that any search for elements on the page could take the time the implicit wait is set for before throwing exception
    driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);

    // It is always advisable to Maximize the window before performing DragNDrop action
    System.out.println("Maximize the window ...");
    driver.manage().window().maximize();
    Thread.sleep(3000L);        

    // Launch the OpenLayers 2.x marker sample 
    System.out.println("Launch the OpenLayers 2.x marker sample  ...");
    Thread.sleep(3000L); 
    driver.get("http://dev.openlayers.org/releases/OpenLayers-2.13.1/examples/markers.html");

    // Create a new Action instance 
    System.out.println("Create a new Action instance ...");
    Actions act = new Actions(driver);

    // Find the viewport inside in witch there is the map   
    System.out.println("Find the viewport inside in witch there is the map ...");
    Thread.sleep(3000L);
    //WebElement el = driver.findElement(By.id("OpenLayers_Map_2_OpenLayers_ViewPort"));
    WebElement el = driver.findElement(By.className("olAlphaImg"));

    // Start the action sequence 
    System.out.println("Start the action sequence  ...");
    Thread.sleep(3000L);
    act.click().perform();        

    // Perform the click operation that opens new window
    // Identify marker
    System.out.println("Identify marker at 285, 111 ...");
    Thread.sleep(3000L);
    act.moveToElement(el, 285, 111).click().build().perform();  

    // Print TEST = OK!!
    System.out.println("TEST = OK !!");
    //driver.quit();

        }
} 

In this case the solution is about you've to consider that the markers are directly on the map image, so they are components of the browser page, so you've to refer to the right element.

The "core" code is about this rows

//WebElement el = driver.findElement(By.id("OpenLayers_Map_2_OpenLayers_ViewPort"));
    WebElement el = driver.findElement(By.className("olAlphaImg"));

The commented row is the wrong code row referring to the viewport, the right code row refers to the object "olAlphaImg".

That's all!

I hope this could be useful for others!

Cesare