Кукловод находит элемент в неправильной вкладке - PullRequest
1 голос
/ 13 января 2020

Когда я пытаюсь щелкнуть продукт, он открывается на новой вкладке, где я выполняю операции с текстовым содержимым. Возвращает ноль, поскольку кукловод ищет элемент в неправильной вкладке

const puppeteer = require('puppeteer');
(async () => {
const browser = await puppeteer.launch({
    "headless": false,
    // "slowMo": 50,
    args: ['--start-fullscreen'],
    defaultViewport: null
});
//Page
const page2 = await browser.newPage();
let username = "g.rajesh690@gmail.com";
let password = "Nation20";
await page2.goto('https://www.flipkart.com');
await page2.waitFor(2000);
await page2.$x("//input[@class='_2zrpKA _1dBPDZ']").then(async ele => {
    await ele[0].type(username);
});
await page2.waitFor(2000);
await page2.$x("//input[@type='password']").then(async ele => {
    await ele[0].type(password);
});
await page2.waitFor(2000);
await page2.$x("//button[@class='_2AkmmA _1LctnI _7UHT_c']").then(async ele => {
    await ele[0].click();
});
await page2.waitFor(3000);
await page2.$x("//input[@class='LM6RPg']").then(async ele => {
    await ele[0].type("iPhone 11");
});
await page2.waitFor(3000);
await page2.$x("//button[@class='vh79eN']").then(async ele => {
    await ele[0].click();
});
await page2.waitFor(2000);
await page2.$x("//div[@class='col col-7-12']/div").then(async ele => {
    await ele[0].click();
});
await page2.waitFor(2000);
let [element] = await page2.$x('//span[@class="_2aK_gu"]');
let text = await page2.evaluate(element => element.textContent, element);
console.log(text);

1 Ответ

2 голосов
/ 13 января 2020

Три способа получить открытую вкладку:

  1. переопределить window.open и установить все (или только элемент, на который вы щелкнули) target="_blank" атрибуты на "_self", чтобы открыть URL в та же вкладка:
await page.evaluateOnNewDocument(() => {
    window.open = (new_url) => {window.location.href = new_url}
    for (let i of document.querySelectorAll('[target="_blank"]'))
        i.setAttribute('target', '_self')
    });

Примечание: это может не работать в кадрах с различным происхождением.

получить всплывающую страницу, используя 'popup' событие:
const [popup] = await Promise.all([
  new Promise(resolve => page.once('popup', resolve)),
  //replace the selector with the selector of the button or link you're clicking
  page.click('a[target=_blank]'),
]);
получить недавно открытую вкладку от pages():
const pages = await browser.pages();
const popup = pages[pages.length -1];

Затем вы можете найти элемент на всплывающей странице. Например, в вашем коде:

await page.waitFor(2000);
const pages = await browser.pages();
const popup = pages[pages.length -1];

let [element] = await popup.$x('//span[@class="_2aK_gu"]');
let text = await popup.evaluate(element => element.textContent, element);
...