Извлечение текста из тега <p>в iframe с помощью Puppeteer - PullRequest
0 голосов
/ 01 ноября 2018

У меня возникают трудности с извлечением текста из iframe.

С учетом кода:

<iframe id="iframe" src="https://myamazingapp/2637374848489595" 
style="width:100%;border:none" height="858px" css="1"></iframe>
<div id="document">
   <html lang ="en">
      <head>...</head>
     <body onLoad="resize();">
         <div>class = "app">
             <div class = my-response">
             <div class="my-response__iconcontainer>..
        </div>
        <div class="my-response__copy">
           <p>Thank you for filling out my form</p>
        </div>
     </div>
</div>//....other members

Мой фрагмент Кукловода выглядит следующим образом:

  const frame = page.frames().find(frame => frame.name() === 'iframe');
  await frame.$('body > div > div > div > div.my-response__copy > p');
  const text = page.evaluate(el => el.innerHTML, await page.$('body > div > div > div > div.my-response__copy > p'));
  expect(text).to.equal('Thank you for filling out my form');

Трассировка стека начинается как:

 { AssertionError: expected {} to equal 'Thank you for filling out my form.'
at changeOptions (/Users/firstname.lastname/Documents/projects/qa-tests/tests/widget/fillform.js:49:25)
at process._tickCallback (internal/process/next_tick.js:68:7)
message:
 'expected {} to equal \'Thank you for filling out my form\'',
 showDiff: true,
 actual: Promise { <pending> },
 expected: 'Thank you for filling out my form' }

Любые идеи, как извлечь текст, чтобы я мог утверждать против этого?

Спасибо

Ответы [ 2 ]

0 голосов
/ 04 января 2019

Вы можете получить содержимое из iframe и использовать cheerio для перемещения по элементам и получения текста / html или любого другого материала, который вы хотите.

Пример:

const frame = page.frames().find(frame => frame.name() === 'iframe');
const content = await frame.content();
const $ = cheerio.load(content);
const p = $('p').text();
// the text of p
console.log(p);
0 голосов
/ 01 ноября 2018

page.evaluate() возвращает Promise.

возвращает: <Promise<Serializable>> Обещание, которое разрешается до возвращаемого значения pageFunction

Если честно, в сообщении указывается, что:

actual: Promise { <pending> },

Так что используйте await где-нибудь результат:

const text = await page.evaluate(el => el.innerHTML, await page.$('body > div > div > div > div.my-response__copy > p'));
expect(text).to.equal('Thank you for filling out my form');

или

const text = page.evaluate(el => el.innerHTML, await page.$('body > div > div > div > div.my-response__copy > p'));
expect(await text).to.equal('Thank you for filling out my form');

Я бы предпочел первый. Кроме того, у меня сложилось впечатление, что взамен await внутри page.evaluate может не понадобиться.

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