javascript — codeceptjs / puppeteer не распознает оператор if

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, обещаниями или кукловодом. Я перепробовал много вещей и провел исследование в течение нескольких дней.

Поток приложений:

  1. С помощью автоматизации перейдите на сайт
  2. Соскрести данные со страницы, нажать на массив
  3. Если есть «следующая страница», нажмите кнопку «Следующая страница»
  4. Очистить данные со страницы, нажать на тот же массив
  5. Повторение

Проблема:

Моя проблема с № 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 действителен только в асинхронной функции

Понравилась статья? Поделиться с друзьями:
JavaScript & TypeScript
Adblock
detector