Не удается прочитать свойство 'getAttribute' с нулевым значением - PullRequest
0 голосов
/ 10 июля 2019

Я использую кукловод, чтобы проверить интерфейс моего сайта.Однако, когда я показываю баннер в таблице, я получаю сообщение об ошибке,

Мой HTML table-body выглядит следующим образом:

<tbody>
   <tr role="row" class="odd">
      <td tabindex="0">7/9/2019</td>
      <td>Product 1</td>
      <td>Active</td>
      <td><a href="test">Category 1</a></td>
   </tr>
   <tr role="row" class="even">
      <td style="width: 0; padding: 0"></td>
      <td style="width: 0; padding: 0"></td>
      <td style="width: 0; padding: 0"></td>
      <td style="width: 0; padding: 0"></td>
      <td style="width: 0; padding: 0"></td>
      <td style="width: 0; padding: 0"></td>
      <td style="width: 0; padding: 0"></td>
   </tr>

Мой код page.evaluate () выглядит следующим образомследующее:

                data = await page.evaluate(async () => {
                    let data = [];
                    let grabFromRow = (row, child) => {
                        const td = row
                            .querySelector(`td:nth-child(${child})`)
                        return td ? td.innerText.trim() : null
                    }
                    let grabLinkFromRow = (row, child) => {
                        const td = row
                            .querySelector(`td:nth-child(${child}) > a`).getAttribute("href");  // here I get the error
                        return td ? td : null;
                    };

                    let rows = "#producttable > tbody > tr"

                    let tableRows = document.querySelectorAll(rows)
                    for (const tr of tableRows) {
                        data.push({
                            date: grabFromRow(tr, 1),
                            product: grabFromRow(tr, 2),
                            status: grabFromRow(tr, 3),
                            category: grabFromRow(tr, 4),
                            categoryLink: grabLinkFromRow(tr, 4),
                        });
                    }
                    return data;
                });

Любые предложения, как пропустить эти строки emtpy и все еще выполнить мой сценарий тестирования?

Я ценю ваши ответы!

Ответы [ 3 ]

1 голос
/ 10 июля 2019

Запись цепной операции в одном операторе может привести к этой ошибке, потому что, если какой-либо шаг цепочки завершится неудачно, он может вернуть null или undefined, и тогда любые дальнейшие предпринятые операции потерпят неудачу.В вашей функции grabLinkFromRow эта строка имеет вид:

const td = row.querySelector(`td:nth-child(${child}) > a`).getAttribute("href");

Проблема здесь в том, что querySelector возвращает null, поскольку в строке нет ссылок.Это означает, что вы пытаетесь вызвать null.getAttribute("href") и, следовательно, ошибку.

Прежде чем продолжить, убедитесь, что нашли ссылку:

let grabLinkFromRow = (row, child) => {
  let td;
  const link = row.querySelector(`td:nth-child(${child}) > a`);
  if (link) {   // <-- only call getAttribute if we found a link
    td = link.getAttribute("href");
  }
  return td ? td : null;
}
1 голос
/ 10 июля 2019

У вас была правильная идея в вашей другой функции, grabFromRow, где вы устанавливаете td в результат querySelector и проверяете его на достоверность.

   let grabLinkFromRow = (row, child) => {
        const td = row
            .querySelector(`td:nth-child(${child}) > a`);
        return td ? td.getAttribute("href") : null;
   };
1 голос
/ 10 июля 2019

вам нужно сначала проверить, доступен ли тег a или нет, если да, тогда getAttribute и вернуть else, возвращают ноль.

const td = row.querySelector(`td:nth-child(${child}) > a`);  // here I get the error
 if ( td ) {
    return td.getAttribute("href");
 }
    return null;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...