2016-04-22 3 views
0

Я хочу автоматизировать загрузку данных Google извлечения с помощью Selenium с веб-браузером PhantomJS. Я разработал действия в надстройке Selenium IDE Firefox и преобразовал вывод HTML тестового примера в JS, используя пакет npm selenium-html-js-converter. Мои селекторы отлично работают в Mozilla Firefox 45.0.2, но если использовать преобразованную версию он выдает следующее сообщение:Selenium с phantomJS терпит неудачу, но работает в 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). 

Это та часть, где я хочу, чтобы исключить определенные приложения Google из этого вызывного. Я создаю все селекторы вручную, так как я не хочу полагаться на классы и идентификаторы элементов, поскольку они автоматически генерируются некоторым инструментом сборки и могут меняться в любое время.

I read in this post, что цитаты могут быть проблемой, но оценка по-прежнему не выполняется без кавычек. Я также попытался изменить свой пользовательский агент в Firefox на тот, который использует PhantomJS (Mozilla/5.0 (Unknown; Linux x86_64) AppleWebKit/538.1 (KHTML, like Gecko) PhantomJS/2.1.1 Safari/538.1), чтобы убедиться, что вывод сайта такой же, но он все еще работает. Однако я не знаю, как изменить строку пользовательского агента в Selenium.

Моего Селен основного код выглядит следующим образом (я опустил автоматически сгенерированные вспомогательные функции, чтобы сохранить его аккуратным):

"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; 
    } 

}; 

скриншот, который сделан, когда тест не показывает мне нужную страницу.

Я использую последние стабильные версии NodeJS (5.10.1), PhantomJS (2.1.1) и Selenium (2.53.1).

Что здесь общего не работает?

ответ

0

Вам нужно процитировать каждое значение атрибута, чтобы сделать XPath Валиде:

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

значений атрибутов в кавычки, где автоматически сгенерированный код и моя первая попытка, которая не удалось. Но я отредактирую свой ответ, чтобы показать правильный XPath. – Noir

+1

XPath все еще неверен, вам нужно удалить escape перед цитатой. –

Смежные вопросы