web-dev-qa-db-fra.com

Comment implémenter PhantomJS avec Selenium WebDriver en utilisant Java

Je deviens fou, vraiment. J'ai ce code:

public class Creazione extends TestCase {
    private PhantomJSDriver driver;
    private String baseUrl;
    private boolean acceptNextAlert = true;
    private StringBuffer verificationErrors = new StringBuffer();

    @Before
    public void setUp() throws Exception {
        File file = new File("C:/Program Files/phantomjs-1.9.7-windows/phantomjs.exe");
        System.setProperty("phantomjs.binary.path", file.getAbsolutePath());
        driver = new PhantomJSDriver();
        baseUrl = "http://www.gts.fiorentina.test/";
        driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS);
        driver.get(baseUrl + "/Account/Login.aspx?ReturnUrl=%2f");
        findDynamicElement(By.id("tbUserName_I"), 2000);
        driver.findElement(By.id("tbUserName_I")).clear();
        driver.findElement(By.id("tbUserName_I")).sendKeys("rogai");
        driver.findElement(By.id("tbPassword_I")).clear();
        driver.findElement(By.id("tbPassword_I")).sendKeys("Fiorentina2014!");
        driver.findElement(By.id("btnLogin_CD")).click();
        driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS);
    }

    @Test
    public void testCreazione() throws Exception {
        driver.get(baseUrl + "/SegreteriaSportiva/Calciatori.aspx");
        findDynamicElement(By.cssSelector("#ASPxButton1_CD > span"), 2000);
        driver.findElement(By.cssSelector("#ASPxButton1_CD > span")).click();
        findDynamicElement(By.id("FrmEdit_TS_TipoPersonaId_FK_B-1"), 2000);
        driver.findElement(By.id("FrmEdit_TS_TipoPersonaId_FK_B-1")).click();
        driver.findElement(By.id("FrmEdit_TS_TipoPersonaId_FK_DDD_L_LBI2T0")).click();
        driver.findElement(By.id("FrmEdit_Nome_I")).clear();
        driver.findElement(By.id("FrmEdit_Nome_I")).sendKeys("Prova");
        driver.findElement(By.id("FrmEdit_Cognome_I")).clear();
        driver.findElement(By.id("FrmEdit_Cognome_I")).sendKeys("Calciatore");
        driver.findElement(By.id("FrmEdit_TS_RuoloId_FK_B-1")).click();
        driver.findElement(By.id("FrmEdit_TS_RuoloId_FK_DDD_L_LBI3T0")).click();
        driver.findElement(By.id("FrmEdit_DataNascita_I")).clear();
        driver.findElement(By.id("FrmEdit_DataNascita_I")).sendKeys("01/01/2014");
        driver.findElement(By.id("FrmEdit_Cittadinanza_I")).clear();
        driver.findElement(By.id("FrmEdit_Cittadinanza_I")).sendKeys("italiana");
        driver.findElement(By.id("FrmEdit_LuogoNascita_I")).clear();
        driver.findElement(By.id("FrmEdit_LuogoNascita_I")).sendKeys("roma");
        driver.findElement(By.cssSelector("#BTN_Edit_CD > span")).click();
        driver.findElement(By.id("Grid_DXFREditorcol3_I")).click();
        driver.findElement(By.id("Grid_DXFREditorcol3_I")).sendKeys("Prova");
        assertEquals("Prova",driver.findElement(By.xpath("//tr[@id='Grid_DXDataRow0']/td[3]")).getText());
    }
}

Après exécution, j'obtiens ces erreurs lors de l'exécution. La trace suivante ---

org.openqa.Selenium.InvalidElementStateException: {"errorMessage":"Element is not currently interactable and may not be manipulated","request":{"headers":{"Accept-Encoding":"gzip,deflate","Connection":"Keep-Alive","Content-Length":"27","Content-Type":"application/json; charset=utf-8","Host":"localhost:20497","User-Agent":"Apache-HttpClient/4.3.2 (Java 1.5)"},"httpVersion":"1.1","method":"POST","post":"{\"id\":\":wdc:1402393987914\"}","url":"/clear","urlParsed":{"anchor":"","query":"","file":"clear","directory":"/","path":"/clear","relative":"/clear","port":"","Host":"","password":"","user":"","userInfo":"","authority":"","protocol":"","source":"/clear","queryKey":{},"chunks":["clear"]},"urlOriginal":"/session/e4b71580-f084-11e3-959e-273aa801dd81/element/%3Awdc%3A1402393987914/clear"}}
Command duration or timeout: 215 milliseconds
Build info: version: '2.42.1', revision: '68b415a', time: '2014-05-29 16:17:18'
System info: Host: 'Silvio-Acer', ip: '10.10.1.122', os.name: 'Windows 7', os.Arch: 'x86', os.version: '6.1', Java.version: '1.7.0_55'
Session ID: e4b71580-f084-11e3-959e-273aa801dd81
Driver info: org.openqa.Selenium.phantomjs.PhantomJSDriver
Capabilities [{platform=XP, acceptSslCerts=false, javascriptEnabled=true, browserName=phantomjs, rotatable=false, driverVersion=1.1.0, locationContextEnabled=false, version=1.9.7, cssSelectorsEnabled=true, databaseEnabled=false, handlesAlerts=false, browserConnectionEnabled=false, webStorageEnabled=false, nativeEvents=true, proxy={proxyType=direct}, applicationCacheEnabled=false, driverName=ghostdriver, takesScreenshot=true}]
    at Sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at Sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source)
    at Sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source)
    at Java.lang.reflect.Constructor.newInstance(Unknown Source)
    at org.openqa.Selenium.remote.ErrorHandler.createThrowable(ErrorHandler.Java:204)
    at org.openqa.Selenium.remote.ErrorHandler.throwIfResponseFailed(ErrorHandler.Java:156)
    at org.openqa.Selenium.remote.RemoteWebDriver.execute(RemoteWebDriver.Java:600)
    at org.openqa.Selenium.remote.RemoteWebElement.execute(RemoteWebElement.Java:268)
    at org.openqa.Selenium.remote.RemoteWebElement.clear(RemoteWebElement.Java:113)
    at com.example.tests.Creazione.testCreazione(Creazione.Java:59)
    at Sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at Sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at Sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at Java.lang.reflect.Method.invoke(Unknown Source)
    at junit.framework.TestCase.runTest(TestCase.Java:176)
    at junit.framework.TestCase.runBare(TestCase.Java:141)
    at junit.framework.TestResult$1.protect(TestResult.Java:122)
    at junit.framework.TestResult.runProtected(TestResult.Java:142)
    at junit.framework.TestResult.run(TestResult.Java:125)
    at junit.framework.TestCase.run(TestCase.Java:129)
    at junit.framework.TestSuite.runTest(TestSuite.Java:255)
    at junit.framework.TestSuite.run(TestSuite.Java:250)
    at org.junit.internal.runners.JUnit38ClassRunner.run(JUnit38ClassRunner.Java:84)
    at org.Eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.Java:50)
    at org.Eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.Java:38)
    at org.Eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.Java:467)
    at org.Eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.Java:683)
    at org.Eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.Java:390)
    at org.Eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.Java:197)
Caused by: org.openqa.Selenium.remote.ScreenshotException: Screen shot has been taken
Build info: version: '2.42.1', revision: '68b415a', time: '2014-05-29 16:17:18'
System info: Host: 'Silvio-Acer', ip: '10.10.1.122', os.name: 'Windows 7', os.Arch: 'x86', os.version: '6.1', Java.version: '1.7.0_55'
Driver info: driver.version: RemoteWebDriver
    at org.openqa.Selenium.remote.ErrorHandler.throwIfResponseFailed(ErrorHandler.Java:136)
    ... 23 more
Caused by: org.openqa.Selenium.remote.ErrorHandler$UnknownServerException: {"errorMessage":"Element is not currently interactable and may not be manipulated","request":{"headers":{"Accept-Encoding":"gzip,deflate","Connection":"Keep-Alive","Content-Length":"27","Content-Type":"application/json; charset=utf-8","Host":"localhost:20497","User-Agent":"Apache-HttpClient/4.3.2 (Java 1.5)"},"httpVersion":"1n.1","method":"POST","post":"{\"id\":\":wdc:1402393987914\"}","url":"/clear","urlParsed":{"anchor":"","query":"","file":"clear","directory":"/","path":"/clear","relative":"/clear","port":"","Host":"","password":"","user":"","userInfo":"","authority":"","protocol":"","source":"/clear","queryKey":{},"chunks":["clear"]},"urlOriginal":"/session/e4b71580-f084-11e3-959e-273aa801dd81/element/%3Awdc%3A1402393987914/clear"}}
Build info: version: '2.42.1', revision: '68b415a', time: '2014-05-29 16:17:18'
System info: Host: 'Silvio-Acer', ip: '10.10.1.122', os.name: 'Windows 7', os.Arch: 'x86',       os.version: '6.1', Java.version: '1.7.0_55'
    Driver info: driver.version: unknow

J'ai ajouté le phantomjs.exe au chemin Windows, en tant que bibliothèque externe ghostdriver.jar, mais rien ...

C'est comme deux jours que j'essaye de le faire fonctionner ...

7
Marvin

Essayez ceci, cela a fonctionné pour moi  

DesiredCapabilities caps = new DesiredCapabilities();
caps.setJavascriptEnabled(true);                
caps.setCapability("takesScreenshot", true);  
caps.setCapability(
                        PhantomJSDriverService.PHANTOMJS_EXECUTABLE_PATH_PROPERTY,
                        "your custom path\\phantomjs.exe"
                    );
WebDriver driver = new  PhantomJSDriver(caps);

alors le reste d'entre eux sont similaires..et pls aimablement commenter votre observation, passez une bonne journée :)

26
Sankar

Je suis confronté au même problème avec vous. Je peux utiliser le même code avec FirefoxDriver, mais lorsque je le change en PhantomJSDriver, il tombe en panne.

Pouvez-vous essayer FirefoxDriver au lieu de PhantomJSDriver? Il suffit de changer driver = new FirefoxDriver()

En fait, si je modifie le code exemple fourni par Selenium, change le lecteur firefox en pilote phantonjs, cela fonctionne bien. Aucune idée de quel est le problème en utilisant phantomjs.

import org.openqa.Selenium.By;
import org.openqa.Selenium.WebDriver;
import org.openqa.Selenium.WebElement;
import org.openqa.Selenium.phantomjs.PhantomJSDriver;
import org.openqa.Selenium.support.ui.ExpectedCondition;
import org.openqa.Selenium.support.ui.WebDriverWait;

public class Selenium2Example  {
    public static void main(String[] args) {
        // Create a new instance of the Firefox driver
        // Notice that the remainder of the code relies on the interface, 
        // not the implementation.
        System.setProperty("phantomjs.binary.path", System.getProperty("user.dir")+"/phantomjs");
        WebDriver driver = new PhantomJSDriver();
        // And now use this to visit Google
        driver.get("http://www.google.com");
        // Alternatively the same thing can be done like this
        // driver.navigate().to("http://www.google.com");

        // Find the text input element by its name
        WebElement element = driver.findElement(By.name("q"));

        // Enter something to search for
        element.sendKeys("Cheese!");

        // Now submit the form. WebDriver will find the form for us from the element
        element.submit();

        // Check the title of the page
        System.out.println("Page title is: " + driver.getTitle());

        // Google's search is rendered dynamically with JavaScript.
        // Wait for the page to load, timeout after 10 seconds
        (new WebDriverWait(driver, 10)).until(new ExpectedCondition<Boolean>() {
            public Boolean apply(WebDriver d) {
                return d.getTitle().toLowerCase().startsWith("cheese!");
            }
        });

        // Should see: "cheese! - Google Search"
        System.out.println("Page title is: " + driver.getTitle());

        //Close the browser
        driver.quit();
    }
}
3
Freya Ren

Je rencontre le même problème lorsque j'utilisais la version 1.9.7 de Phantomjs. Je pense que cette version suivante a un problème. Veuillez utiliser la version 1.9.0 de phantomjs. Ceci est la version plus stable. 

Voici le lien de téléchargement: https://code.google.com/p/phantomjs/downloads/detail?name=phantomjs-1.9.0-windows.Zip&can=4&q=

0
user2982537

Téléchargez les plus récentes liaisons Selenium Java - 2.45. Ensuite, retirez le 2.44 (ou tout ce que vous utilisez) de votre bibliothèque.

Ensuite, incluez les éléments suivants dans votre code:

import org.openqa.Selenium.phantomjs.PhantomJSDriver;
import org.openqa.Selenium.phantomjs.PhantomJSDriverService;

public void setUp() throws Exception {

DesiredCapabilities DesireCaps = new DesiredCapabilities();
DesireCaps.setCapability(PhantomJSDriverService.PHANTOMJS_EXECUTABLE_PATH_PROPERTY, "C://phantomjs.exe");
WebDriver driver = new PhantomJSDriver(DesireCaps);

REMARQUE * L'emplacement du fichier .exe n'étant peut-être pas dans votre lecteur C, vous devez donc l'indiquer exactement. 

Vous devriez être bon pour aller après cela. 

0
Kyle B.