codeceptjs / puppeteer не распознает оператор if
не очень знаком с js / node.js. использование codeceptjs / puppeteer для некоторых автоматических тестов. сейчас пытаюсь отредактировать описание в тесте. но иногда описания там нет — для этого нет кнопки «редактировать описание» — вместо этого есть кнопка «добавить описание». поэтому я написал заявление, которое указывает. но код просто переворачивает его. не имеет значения, что это за утверждение, оно просто переходит на следующую строку. в настоящее время if (desc)
и if(!desc)
выполняют одну и ту же функцию — он переходит к следующей строке в операторе if. это вызывает ошибку, потому что описание уже есть, и поэтому кнопка «добавить описание» недоступна. Я не уверен, что происходит.
Scenario('test something', (I, userLoginPage, FBPagePage) ={amp}gt; { userLoginPage.validate(); I.click('//*[@id="card_611"]'); // clicks the card var desc = '//*[@id="show_card_description"]/section/button'; // add description button // tried 'Add description' but the result was the same if (desc){ // this is where the error happens. it simply looks for the add description button // no matter what button is there it decides to click the 'add description' button I.click('//*[@id="show_card_description"]/section/button'); // click add desc button I.fillField('//*[@id="description_editor_container"]/div[2]/div[1]', 'not admin user created this description thanks to automated testing'); // types this stuff I.click('//*[@id="description_editor_container"]/button[1]'); // saves it I.wait(1); } I.click('//*[@id="show_card_description"]/section/h5/a'); // click edit desc button if a description already exists I.fillField('//*[@id="description_editor_container"]/div[2]/div[1]', 'not admin user edited this description thanks to automated testing'); I.click('//*[@id="description_editor_container"]/button[1]'); I.say('success!') });
§
Фон:
Я пишу сценарий Nodejs с кукловодом, чтобы очистить данные с веб-страницы. Я не знаком с Nodejs, обещаниями или кукловодом. Я перепробовал много вещей и провел исследование в течение нескольких дней.
Поток приложений:
- С помощью автоматизации перейдите на сайт
- Соскрести данные со страницы, нажать на массив
- Если есть «следующая страница», нажмите кнопку «Следующая страница»
- Очистить данные со страницы, нажать на тот же массив
- Повторение
Проблема:
Моя проблема с № 3. С веб-автоматизации, нажав кнопку следующей страницы. Все, что я хочу, это использовать метод .click () в кукловоде, чтобы нажать на кнопку выбора. Однако .click () возвращает обещание. Поскольку это обещание, мне нужно ключевое слово await
, но вы не можете await
в цикле for (или в любом другом блоке, кроме async
).
Что я пробовал:
Я попытался создать еще одну async
функцию с инструкциями для await page.click();
и вызов этой функции в проблемной области. Я попытался создать обычную функцию с page.click () и вызвать ее в проблемной области. Рефакторинг всего, чтобы это не сработало. Я не совсем понимаю Обещания и Async / Await даже после прочтения об этом в течение нескольких дней.
Что я хочу помочь с:
Помощь в вызове метода .click () внутри проблемной области или любая помощь при выборе «Следующая страница» с помощью веб-автоматизации.
Псевдокод:
let scrape = async () ={amp}gt; { await //do.some.automation; const result = await page.evaluate(() ={amp}gt; { for (looping each page) { if (there is a next page) { for (loop through data) { array.push(data); //----PROBLEM---- //use automation to click the selector of the next page button //-------------- } } } return data; }); //close browser return result; }; scrape().then((value) ={amp}gt; { //output data here; }); });
Весь код:
let scrape = async () ={amp}gt; { const browser = await puppeteer.launch({ headless: false }); const page = await browser.newPage(); await page.goto("GO TO A WEBSITE"); await page.click("CLICK A BUTTON"); await page.waitFor(2000); //Scraping const result = await page.evaluate(() ={amp}gt; { let pages = document.getElementsByClassName("results-paging")[2]; let allPages = pages.getElementsByClassName("pagerLink"); let allJobs = []; //Loop through each page for (var j = 0; j {amp}lt; allPages.length; j ) { let eachPage = pages.getElementsByClassName("pagerLink")[j].innerHTML; if (eachPage) { //Scrape jobs on single page let listSection = document.getElementsByTagName("ul")[2]; let allList = listSection.getElementsByTagName("li"); for (var i = 0; i {amp}lt; allList.length; i ) { let eachList = listSection.getElementsByTagName("li")[i].innerText; allJobs.push(eachList); //--------PROBLEM------------- await page.click('#selector_of_next_page'); //---------------------------- } } else { window.alert("Fail"); } } return allJobs; }); browser.close(); return result; }; scrape().then((value) ={amp}gt; { let data = value.join("rn"); console.log(data); fs.writeFile("RESULTS.txt", data, function (err) { console.log("SUCCESS MESSAGE"); }); });
Сообщение об ошибке:
SyntaxError: await действителен только в асинхронной функции