кукловод на всплывающем диалоге / модал - PullRequest
0 голосов
/ 01 апреля 2020

Цените, если кто-то может помочь

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

модальное диалоговое окно

Это модальное диалоговое окно появляется при нажатии на:

await frame.click ("ul#P11_MAIN_CONTAINER_cards a:nth-child(1) > span")

This oracle Apex dialog.modal не имеет идентификатора или имени, только sr c. Я не могу получить доступ к элементам в этом диалоговом / модальном.

Интересно, есть ли у вас какие-либо рекомендации по этому типу проблемы, кроме того, как кукловод удовлетворяет этот тип "всплывающих окон"

contentFrame [0] является действительным contentFrame 2 действителен на базовой странице.

  • не удалось получить iframe внутри диалога / модального

  • это oracle модальное диалоговое окно вершины появляется после щелчка и, таким образом, блокирует кукловода, так как же go обрабатывает диалог / модальное ? popup?

  • Требуется ли для этого метод targetcreated? если да, то как работает созданная цель в этой части?

  • или для новой вкладки (как показано ниже) требуется const page2 = await browser.newPage();?

 tabindex="-1" role="dialog" class="ui-dialog ui-corner-all ui-widget ui-widget-content ui-front ui-dialog--apex t-Dialog--wizard ui-draggable ui-resizable" aria-describedby="apex_dialog_1" aria-labelledby="ui-id-1" style="position: fixed; height: 90%; width: 90%; top: 5%; left: 5%; max-width: 100%;">.........

Спасибо, если кому-то есть, чем поделиться.

    const puppeteer = require('puppeteer')
const config = require('../lib/config')
const homePage  =  require('../pages/HomePage')
const homePageObjects = require('../pageObjects/homePageObjects')
const loginPage  =  require('../pages/LoginPage')
const helper = require('../lib/helper')


describe('Home Menu Tests',() => {
    let browser
    let page

    
    before(async function(){
        browser = await puppeteer.launch({
            ignoreHTTPSErrors: true,
            headless:config.isHeadless,
            slowMo:config.slowMo,
            devtools:config.isDevtools,
            timeout:config.launchTimeout,
            Args: ['--disable-notifications','--disable-web-notification-custom-layouts'
            ,'--user-data-dir=/home/aspats3/ess/profile','--disable-features=site-per-process' ],
            executablePath:'/usr/bin/google-chrome-stable',
         
            
        })
        
        page = await browser.newPage()
        
        page.setDefaultNavigationTimeout(0);
        await page.setDefaultTimeout(config.waitingTimeout)
        await page.setViewport({
            width:config.viewRepotWidth,
            height:config.viewRepotHeight,  
      
        })
       

  
        await helper.loadUrl(page,config.baseUrl);
        await loginPage.Login(page,'AB0001','concept');

    })

    //after(async function() {
      //  await homePage.Logout(page)
        //await browser.close()
        
    //})
    


    it('Verify My Team - List  ',async()=>{
         
 
        await page.reload({ waitUntil: ["networkidle0", "domcontentloaded"] });
        await helper.hover(page,homePageObjects.homeMenu);
        await page.waitFor(3000);
        await helper.clickX(page,"//a[@id='WJ2000']");
        await page.waitForNavigation({ waitUntil: ["networkidle0", "domcontentloaded"] });
        await page.waitFor(8000);
        //await helper.shouldExistX (page,"//*[contains(.,'Team Details')]")
        //await helper.shouldExistX (page,"//*[contains(.,'Management')]")
        //await helper.shouldExistX (page,"//*[contains(.,'Leave')]")
        //await helper.shouldExistX (page,"//*[contains(.,'Timesheets')]")
        await page.waitForSelector('iframe');
        await page.waitForSelector('#P1_IFRAME')
        console.log('childFrames count:', page.mainFrame().childFrames().length);
        console.log('pageFrames count:', page.frames().length);

        const iframeHandles = await page.$$('iframe');
        
        console.log('contentFrame[0] is valid:', await iframeHandles[0].contentFrame() !== null);
        console.log('contentFrame[1] is valid:', await iframeHandles[1].contentFrame() !== null);


        const elementHandle = await page.$('div#P1_LAUNCHER iframe');
        const frame = await elementHandle.contentFrame();
        await page.waitFor(8000);


        const newPagePromise = new Promise(x => browser.on('targetcreated', target => x(target.frame())));	
        
    
        await frame.click ("ul#P11_MAIN_CONTAINER_cards a:nth-child(1) > span")   click this for dialog modal iframe
		
		
        await frame.waitForNavigation({ waitUntil: ["networkidle0", "domcontentloaded"] });
        await page.waitFor(20000);
		
		
		//  from  here on cant get into dialog modal iframe ( nested iframe ) 
               //`

1 Ответ

0 голосов
/ 01 апреля 2020

Что вы можете сделать, чтобы решить вашу проблему, так это создать новую асинхронную функцию c, и внутри нее вы можете поместить функцию page.evaluate() кукловода. Затем нажмите на кнопку и загрузите модальное (захватите модальное с помощью его атрибута aria-labbelledby) и поместите его содержимое в переменную. Вся эта функция должна быть вне вашей основной функции.

Затем в вашей основной функции вы можете вызвать эту grabTheModal() функцию после go для URL.

Вы можете делать все это следующим образом:

let modalContents;

const grabTheModal = async(page) => {
    await page.evaluate(async () => {
        await new Promise((resolve, reject) => {
            frame.click ("ul#P11_MAIN_CONTAINER_cards a:nth-child(1) > span")
            setTimeout(() => {
                const modal = document.querySelector('[aria-labelledby=ui-id-2]'); // Grab the modal by its aria label
                modalContents = modal.innerHTML;
                resolve();
            }, 500)
        });
    });
}

const getModalContents = async() => {
    let browser = await puppeteer.launch();
    let page = await browser.newPage()
    await page.goto(url, {waitUntil: 'load'}); //Remember to add your own URL in the url variable
    await grabTheModal(page);
    await browser.close();
    console.log(modalContents)
}
getModalContents();
...