Почему Puppeteer не может найти этот элемент ссылки на странице? - PullRequest
2 голосов
/ 27 мая 2020

^^ ОБНОВЛЕНИЕ ^^
Готов заплатить кому-нибудь за то, чтобы он помог мне пройти через это, проблема размещена на codeMentor.io: https://www.codementor.io/u/dashboard/my-requests/9j42b83f0p

I хотел щелкнуть элемент:

<a id="isc_LinkItem_1$20j" href="javascript:void" target="javascript" tabindex="2"
onclick="if(window.isc_LinkItem_1) return isc_LinkItem_1.$30i(event);"
$9a="$9d">Reporting</a>

In: https://stackblitz.com/edit/js-nzhhbk (я не включил текущую страницу, потому что она находится за именем пользователя и проходом)

кажется достаточно простым
----------------------------------------- -----------------------------

раствор1:

page.click('[id=isc_LinkItem_1$20j]') //not a valid selector


решение2:

const linkHandlers = await frame.$x("//a[contains(text(), 'Reporting')]");

if (linkHandlers.length > 0) {
    await linkHandlers[0].click();
} else {
    throw new Error('Link not found');
} //link not found

------------------------------------- ---------------------------------

Я просмотрел все способы выберите и щелкните по нему, и он говорит, что его нет в документе, хотя он явно есть (проверено путем проверки html в chrome инструментов разработчика и вызова: page.evaluate(() => document.body.innerHTML))

** попытался посмотреть, был ли он в iframe
** пытался выбрать по идентификатору
** пытался выбрать по внутреннему тексту
** пытался консоль регистрировать тело в браузере (ведение журнала не работает, проверено на я nspect _element) //nothing happens
** попытался создать предупреждение с основным текстом, используя:
_ evaluate(() => alert(document)) // nothing happens
** попытался создать предупреждение, чтобы проверить, можно ли ввести javascript автор:
_ evaluate(() => alert('works')) // nothing happens
** также пробовал это: Как выбрать элементы внутри элемента iframe в Puppeteer // doesn't work

Вот код, который я создал пока

const page = await browser.newPage();

const login1url =
    'https://np3.nextiva.com/NextOSPortal/ncp/landing/landing-platform';
await page.goto(login1url);
await page.waitFor(1000);
await page.type('[name=loginUserName', 'itsaSecretLol');
await page.type('[name=loginPassword]', 'nopeHaha');
await page.click('[type=submit]');
await page.waitForNavigation();
const login3url = 'https://np3.nextiva.com/NextOSPortal/ncp/admin/dashboard';
await page.goto(login3url);
await page.click('[id=hdr_users]');
await page.goto('https://np3.nextiva.com/NextOSPortal/ncp/user/manageUsers');
await page.goto('https://np3.nextiva.com/NextOSPortal/ncp/user/garrettmrg');
await page.waitFor(2000);
await page.click('[id=loginAsUser]');
await page.waitFor(2000);
await page.click('[id=react-select-5--value');
await page.waitFor(1000);
await page.click('[id=react-select-5--option-0]');
await page.waitFor(20000);
const elementHandle = await page.$('iframe[id=callcenter]');
const frame = await elementHandle.contentFrame();
const linkHandlers = await frame.$x("//a[contains(text(), 'Reporting')]");

if (linkHandlers.length > 0) {
    await linkHandlers[0].click();
} else {
    throw new Error('Link not found');
}

Ответы [ 3 ]

1 голос
/ 28 мая 2020

В вашем решении1:

await page.click('a[id=isc_LinkItem_1\\$20j]');

Или попробуйте:

await page.click('#isc_LinkItem_1\\$20j]');

У меня небольшое впечатление, что вы должны указать, какой элемент вы пытаетесь выбрать перед скобками, в данном случае это элемент .

Во втором решении символ # означает, что мы выбираем элемент по его идентификатору

1 голос
/ 29 мая 2020

Оказывается, предыдущий щелчок вызвал новую вкладку. Кукловод не переходит на новую вкладку, весь предыдущий код выполнялся на старой вкладке. Чтобы исправить все, что нам нужно было сделать, это найти новую вкладку, выбрать ее и выполнить код, вот функция, которую мы написали для выбора для вкладки:

async function getTab(regex, browser, targets) {
let pages = await browser.pages();
if (targets) pages = await browser.targets();
let newPage;
for (let i = 0; i < pages.length; i++) {
    const url = await pages[i].url();
    console.log(url);
    if (url.search(regex) !== -1) {
        newPage = pages[i];
        console.log('***');
        console.log(url);
        console.log('***');
        break;
    }
}
console.log('finished');
return newPage;
}
1 голос
/ 28 мая 2020

из-за isc_LinkItem_1 $ 20j не является допустимым селектором, возможно, вы можете попробовать найти элементы НАЧИНАЯ С isc_LinkItem_1, например

await page.waitForSelector("[id^=isc_LinkItem_1]", {visible: true, timeout: 30000});
await page.click("[id?=isc_LinkItem_1]);

?

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