Изменить код JS Puppeteer на PuppeteerSharp C # - PullRequest
0 голосов
/ 04 апреля 2019

У меня есть Javascript puppeteer код и PuppeteerSharp for C#. Я знаю, что эти библиотеки похожи, и я знаю их сайты.

Но моя проблема в том, что я едва могу управлять этими библиотеками, для каждой библиотеки есть множество методов, и трудно найти необходимые методы, даже если у меня есть рабочий пример, написанный на JS.

Пожалуйста, помогите мне переписать код JS на C #, чтобы он делал подобные вещи. Или, по крайней мере, имена функций, например, метод JS (puppeteer) = метод C # (puppeteerSharp).

(async function main() {
      try {
        const browser = await puppeteer.launch();
        const [page] = await browser.pages();
        page.setDefaultTimeout(0);

        await page.goto('www.example.com');

        await page.waitForSelector('#search-content button.btn-icon');
        let count = 0;
        while (await page.$('#search-content button.btn-icon') !== null && count != 1) {
          const articlesForNow = (await page.$$('#search-content article')).length;
          console.log(`Articles for now: ${articlesForNow}. Getting more...`);
          count += 1;
          await Promise.all([
            page.evaluate(
              () => {
                document.querySelector('#search-content button.btn-icon').click();
              }
            ),
            page.waitForFunction(
              old => document.querySelectorAll('#search-content article').length > old, {},
              articlesForNow
            ),
          ]);
        }

        const articlesAll = (await page.$$('#search-content article')).length;
        console.log(`All articles: ${articlesAll}.`);

        fs.writeFileSync('full.html', await page.content());

        fs.writeFileSync('articles.html', await page.evaluate(
          () => document.querySelector('#search-content div.b-filter__inner').outerHTML
        ));

        fs.appendFileSync('articles.txt', await page.evaluate(
              (fr) => {
                let items = document.querySelectorAll(".product__body");
                let appartmentsData = "";

                for (let i = 0; i < items.length; i++) {
                  let itemLink = items[i].querySelector(".product__link").href;
                  let itemName = items[i].querySelector(".product__link strong").innerHTML;
                  let itemPrice = items[i].querySelector(".product__value").innerHTML;

                  return appartmentsData;
                }, fr
              ));
              // rest of the code

То, что у меня так далеко:

using(var browser = await Puppeteer.LaunchAsync(new LaunchOptions())) {
 var page = await browser.NewPageAsync();
 await page.GoToAsync(LINK);
 await page.WaitForSelectorAsync("#search-content button.btn-icon");

 while (await page.QuerySelectorAsync("#search-content button.btn-icon") != null) {
  var articlesForNow = await page.QuerySelectorAllAsync("#search-content article");

  Console.WriteLine("Items proceed: " + articlesForNow.Length);

  for (int i = 0; i < articlesForNow.Length; i++) {
   string itemOuterHtml = await articlesForNow[i].EvaluateFunctionAsync < string > ("e => e.outerHTML");
  }

  await page.WaitForSelectorAsync("#search-content button.btn-icon").EvaluateFunctionAsync("e => e.click()");
 }
}

Но это счет бесконечности и не останавливается. После того, как элемент равен 1275, он выдает ошибку о моем методе в цикле while.

PuppeteerSharp.WaitTaskTimeoutException: waiting for selector '#search-content button.btn-icon' failed: timeout 30000ms exceeded

1 Ответ

1 голос
/ 05 апреля 2019

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

Прервите цикл while

Давайте посмотрим на код JS,

let count = 0;
while (await page.$('#search-content button.btn-icon') !== null && count != 1) {}

Создает время, которое останавливается, если счетчик равен 1.

Теперь ваш код C #,

while (await page.QuerySelectorAsync("#search-content button.btn-icon") != null)

Это не проверка на счет, это закончится бесконечным циклом while.

Вы должны посчитать число,

int count = 0;
while (await page.QuerySelectorAsync("#search-content button.btn-icon") != null && count != 1){
 // other code
 count++;
}

Таким образом, он остановится после того, как найдет один результат.

Узнайте больше о Promise.all и т. Д.

Остальные вопросы касаются Promise.all и нескольких других вещей. Вот несколько полезных ссылок,

...