selenium driver.findElements () возвращает обещание вместо элемента - PullRequest
0 голосов
/ 01 марта 2020

У меня есть приложение узла (на linux с селеном Chrome без головы), где у меня есть простой метод, как показано в коде ниже:

var driver = new webdriver.Builder()
   .forBrowser('chrome')
   .setChromeOptions(new chrome.Options().addArguments('--headless'))
   .build();


async function getElementWithClassnameFromPageLoadedInDriver(eleClassname, curDriver){

   let arrElements = await curDriver.findElements(By.className(eleClassname));

   return arrElements[0];
}


async function test(url){

   await driver.get(url);

   let ele = await getElementWithClassnameFromPageLoadedInDriver("myClassForH2Tag", driver);  

   console.log( util.inspect(ele) );
   // prints the following:
   /*
      WebElement {
        driver_: 
         thenableWebDriverProxy {
           session_: Promise { [Object] },
           executor_: Executor { w3c: true, customCommands_: [Object], log_: [Object] },
           fileDetector_: null,
           onQuit_: [Function: onQuit],
           then: [Function: bound then],
           catch: [Function: bound catch] },
        id_: Promise { '612338d3-b812-42f7-99e3-533ea33f85bc' } }
   */

   ele.getText(); 
   // causes a crash with error ....  .getText() is not a function

   return ele;
}

Я пытаюсь получить значение тегов типа h2 , p , указав имя класса. Я занимаюсь этим уже несколько часов и пытался добавить sleep (не хотел), then () , но ничего не работает.

Пожалуйста, совет, как решить эту проблему. Я хотел бы придерживаться async / await, чтобы код легче читался.

Ответы [ 2 ]

0 голосов
/ 02 марта 2020

Ответ, который я получил как обещание, был правильным ответом. Я просто пытался вызвать метод, который не существует для тегов P и H2.

Вместо .getText () я должен был вызвать .getAttribute ("inner HTML"). Это решило мою проблему. Теперь я могу получить нужные значения.

0 голосов
/ 01 марта 2020

getElementWithClassnameFromPageLoadedInDriver является асинхронной c функцией, поэтому вам нужно дождаться ее, прежде чем получить вывод. Как это

async function test(url){

   await driver.get(url);

   let ele = await getElementWithClassnameFromPageLoadedInDriver("myClassForH2Tag", driver);  

   console.log( util.inspect(ele) );
   // prints the following:
   /*
      WebElement {
        driver_: 
         thenableWebDriverProxy {
           session_: Promise { [Object] },
           executor_: Executor { w3c: true, customCommands_: [Object], log_: [Object] },
           fileDetector_: null,
           onQuit_: [Function: onQuit],
           then: [Function: bound then],
           catch: [Function: bound catch] },
        id_: Promise { '612338d3-b812-42f7-99e3-533ea33f85bc' } }
   */

   ele.getText(); 
   // causes a crash with error ....  .getText() is not a function

   return ele;
}

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...