2016-04-22 4 views
0

Ich möchte den Download meiner Google-Takeout-Daten mit Selenium mit dem PhantomJS-Webdriver automatisieren. Ich entwickelte die Aktionen im Selenium IDE Firefox-Add-On und konvertierte die HTML-Ausgabe des Testfalls in JS mit dem npm-Paket selenium-html-js-converter. Meine Wähler arbeiten perfekt in Mozilla Firefox 45.0.2, aber wenn die konvertierte Version verwenden Sie es nicht mit der folgenden Meldung:Selen mit phantomJS schlägt fehl, funktioniert aber in Firefox

Error: Failure in Selenium command "click("//tbody[@data-id=drive]/tr/td/div/", "")": [elementByXPath("//tbody[@data-id=drive]/tr/td/div/")] Error response status: 32, , InvalidSelector - Argument was an invalid selector (e.g. XPath/CSS). 

Dies ist der Teil, wo ich bestimmte Google Apps aus diesem Takeout ausschließen möchten. Ich baue alle Selektoren von Hand, da ich mich nicht auf die Klassen und IDs der Elemente verlassen möchte, da diese automatisch von einem Build-Tool generiert werden und sich jederzeit ändern können.

I read in this post, dass Zitate könnte ein Problem sein, aber die Auswertung schlägt immer noch ohne Anführungszeichen. Ich habe auch versucht, meinen Benutzer-Agent in Firefox auf den zu ändern, den PhantomJS verwendet (Mozilla/5.0 (Unknown; Linux x86_64) AppleWebKit/538.1 (KHTML, like Gecko) PhantomJS/2.1.1 Safari/538.1), nur um sicherzustellen, dass die Website-Ausgabe die gleiche ist, aber es funktioniert immer noch. Ich weiß jedoch nicht, wie ich die User-Agent-Zeichenfolge in Selen ändern kann.

Mein Selenium Core-Code sieht wie folgt aus (I die automatisch generierten Hilfsfunktionen ausgelassen zu halten, ordentlich):

"use strict"; 
/* jslint node: true */ 

var assert = require('assert'); 

var browser, element, currentCommand = '', 
    options = { 
     timeout: 30000, 
     retries: 0, 
     screenshotFolder: 'screenshots/test_minimal_takeout_mobile_html', 
     baseUrl: 'https://accounts.google.com/' 
    }; 

module.exports = function testMinimalTakeoutMobileHtml(_browser, _options) { 

    browser = _browser; 
    var acceptNextAlert = true; 
    getRuntimeOptions(_options); 
    try { 
     currentCommand = 'open("/ServiceLogin?passive=1209600&continue=https%3A%2F%2Faccounts.google.com%2FManageAccount#identifier", "")'; 
     browser.get(addBaseUrl("/ServiceLogin?passive=1209600&continue=https%3A%2F%2Faccounts.google.com%2FManageAccount#identifier")); 

     currentCommand = 'type("id=Email", "[email protected]")'; 
     browser.elementById("Email").clear(); 
     browser.elementById("Email").sendKeys("[email protected]"); 

     currentCommand = 'click("id=next", "")'; 
     browser.elementById("next").click(); 

     currentCommand = 'uncheck("id=PersistentCookie", "")'; 
     if (browser.elementById("PersistentCookie").isSelected()) { 
      browser.elementById("PersistentCookie").click(); 
     }; 

     currentCommand = 'type("id=Passwd", "password")'; 
     browser.elementById("Passwd").clear(); 
     browser.elementById("Passwd").sendKeys("password"); 

     currentCommand = 'clickAndWait("id=signIn", "")'; 
     doAndWait(function() { 
      browser.elementById("signIn").click(); 
     }); 

     currentCommand = 'open("https://takeout.google.com/settings/takeout", "")'; 
     browser.get(addBaseUrl("https://takeout.google.com/settings/takeout")); 

     currentCommand = 'click("//tbody[@data-id=\'drive\']/tr/td/div/", "")'; 
     //<<< It fails here >>> 
     browser.elementByXPath("//tbody[@data-id=\'drive\']/tr/td/div/").click(); 

     currentCommand = 'click("//tbody[@data-id=\'chat\']/tr/td/div/", "")'; 
     browser.elementByXPath("//tbody[@data-id=\'chat\']/tr/td/div/").click(); 

     currentCommand = 'click("//tbody[@data-id=\'gmail\']/tr/td/div/", "")'; 
     browser.elementByXPath("//tbody[@data-id=\'gmail\']/tr/td/div/").click(); 

     currentCommand = 'click("//div[@data-state=\'1\']/div[2]/div[2]/div", "")'; 
     browser.elementByXPath("//div[@data-state=\'1\']/div[2]/div[2]/div").click(); 

     currentCommand = 'mouseDown("//div[@data-param=\'destination\']/div[2]/div[@role=\'presentation\']/div[2]", "")'; 
     browser.elementByXPath("//div[@data-param=\'destination\']/div[2]/div[@role=\'presentation\']/div[2]").mouseDown(); 

     currentCommand = 'mouseUp("//div[@data-param=\'destination\']/div[2]/div[@role=\'presentation\']/div[2]", "")'; 
     browser.elementByXPath("//div[@data-param=\'destination\']/div[2]/div[@role=\'presentation\']/div[2]").mouseUp(); 

     currentCommand = 'click("//div[@data-param=\'destination\']/div[2]/div[3]/div[@data-value=\'DRIVE\']", "")'; 
     browser.elementByXPath("//div[@data-param=\'destination\']/div[2]/div[3]/div[@data-value=\'DRIVE\']").click(); 

     currentCommand = 'click("//div[@data-state=\'2\']/div[2]/div[2]/div", "")'; 
     browser.elementByXPath("//div[@data-state=2]/div[2]/div[2]/div").click(); 

    } catch (e) { 
     var failedScreenShot = options.screenshotFolder + '/[email protected]' + currentCommand.replace(/\(.+/, '') + '.png'; 
     try { 
      createFolderPath(options.screenshotFolder); 
      browser.saveScreenshot(failedScreenShot); 
     } catch (e) { 
      e.message = 'Failure in Selenium command "' + currentCommand + '": ' + e.message + ' (Could not save screenshot after failure occured)'; 
      throw e; 
     } 
     e.message = 'Failure in Selenium command "' + currentCommand + '": ' + e.message + ' (Screenshot was saved to ' + failedScreenShot + ')'; 
     throw e; 
    } 

}; 

Der Screenshot, der genommen wird, wenn der Test fehlschlägt, zeigt mir die richtige Seite.

Ich verwende die neuesten stabilen Versionen von NodeJS (5.10.1), PhantomJS (2.1.1) und Selenium (2.53.1).

Was läuft hier falsch?

Antwort

0

Sie müssen jeden Attributwert zitieren die XPath valide zu machen:

browser.elementByXPath("//tbody[@data-id='drive']/tr/td/div/").click(); 
+0

Die Attributwerte mit Anführungszeichen, wobei der automatisch generierten Code und mein erster Versuch, die fehlgeschlagen. Aber ich bearbeite meine Antwort, um den korrekten XPath anzuzeigen. – Noir

+1

Der XPath ist immer noch falsch, Sie müssen das Escape vor dem Zitat entfernen. –