Testcafe: Expecting Variable показывает объект Object или NaN - PullRequest
0 голосов
/ 16 января 2020

Я пытаюсь добавить некоторые числа, которые приходят из DIV, но я не могу добавить его, потому что он дает мне [объектный объект] [объектный объект], добавленный вместе, и когда я пытался String, он дает мне Объект объекта и с Number или ParseInt, я получаю NaN

Testcode:

<div class="test1">
<div> Title </div>
<div>13</div>
</div>

Когда я делаю это let patientNum1 = Selector('test').child('div').nth(1).textContent; и делаю что-то вроде .expect (PatienNum1) .eql (5) это фактически вывел бы «Ожидаемый 13 равный 5», моя цель - получить это 13 и добавить его с другим подобным divclass (test1) друг с другом.

Моя цель останавливается здесь:

let newNum = patientNum1 + patientNum2;
await t
.expect(newNum).eql(15);
AssertionError: expected '[object Object][object Object]' to deeply
      equal 15
let newNum = parseInt(patientNum1) + parseInt(patientNum2);
await t
.expect(newNum).eql(15);
1) AssertionError: expected NaN to deeply equal 15

Есть идеи?

1 Ответ

1 голос
/ 16 января 2020

Одна из ваших переменных не та, о которой вы думаете.

const p1 = document.querySelector('.test > :first-child').textContent;
const p2 = document.querySelector('.test > :last-child').textContent;
let p3;

console.log(p1); // 13
console.log(p2); // 5
console.log( p1 + p2 ); // 135 (concatenated strings)
console.log( parseInt(p1) + parseInt(p2) ); // 18
console.log( parseInt(p1) + parseInt(p3) ); // NaN
<div class="test">
  <div>13</div>
  <div>5</div>
</div>

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

// utility for parsing ints from dom elements.
// throws on NaN
function asInt (element) {
  const intValue = parseInt(element.textContent);
  if (isNaN(intValue)) {
    throw new Error('unable to parse number');
  }
  return intValue;
}

function doSomethingInteresting () {
  // get the elements where class="patient"
  const patients = document.querySelectorAll('.patient');
  
  // iterate over each 'patient' (each <li> in this case)
  patients.forEach((patient, index) => {

    // look for child nodes with class="value"
    // and extract their contents as integers via map(asInt)
    const numbers = [...patient.querySelectorAll('.value')].map(asInt);
    
    // compute the sum of the numbers for this 'patient'
    const sum = numbers.reduce((acc, v) => (acc + v), 0);
    
    // do whatever you need to do with the result
    console.log(`patient ${index}: ${sum}`);
  })
}

// go
doSomethingInteresting();
.patient {
  display: flex;
}

.patient > * {
  flex: 0 0 60px;
  margin: 16px 8px;
  border: 1px solid #ccc;
  padding: 8px;
}
<ul>
  <li class="patient">
    <div class="value">13</div>
    <div class="value">5</div>
  </li>
  <li class="patient">
    <div class="value">26</div>
    <div class="value">15</div>
  </li>
  <li class="patient">
    <div class="value">14</div>
    <div class="value">3</div>
  </li>
  <li class="patient">
    <div class="value">16</div>
    <div class="value">99</div>
  </li> 
</ul>
...