赛普拉斯+ TS:从HTMLelement获取文本

时间:2018-10-23 13:19:10

标签: typescript get browser-automation cypress

我正在与:

Cypress.io和TypeScript。

我遇到了逻辑问题。

我想做什么

几页中有元素列表。我要获取该元素列表,并检查它们是否具有某种名称,如果其中之一具有该名称,请打开它。 我遇到了这样的问题,我无法从HTML元素中获取文本。这是我的代码:

it.only('should be able to open element', function () {
 cy.get('.page-number').each(function () { // Using this to get all pages 
    cy.get('div[class="name"] > a > u').then(elem => { //Here I get elements with job names
      console.log('1 ', elem.get(0)); //RESULT: only that one element name. Example:<u _ngcontent-c10="">Element 1</u>
      console.log('2 ', elem.text()); //RESULT: all elements in a page as text
      const textElem = elem.get(1); 
      let txt = +textElem;
      console.log('3 ', textElem); //RESULT: tried to convert it like this. Example:<u _ngcontent-c10="">Element 1</u>
      console.log('4 ', elem.get(0).text()); //RESULT: Error Message: TS2339: Property 'text' does not exist on type 'HTMLElement'.
      let i = 0;
      const jobName = elem.get(i);
      console.log('3 ', elem.get(i));
    if({HERE I WANT TO GET ELEMENT TEXT} === 'My text'){
      //TODO
     }
       else{
          if(expect(i).to.be.oneOf([8, 16, 24])){ //one page have 8 elements
          cy.get('.page-number').click({multiple : true}); //one another page with elements
          cy.log('ELEMENT WAS NOT FIND IN PAGE.');
          }
         i++;
       }
    });
  });
})

问题: 在这种情况下,如何获取HTMLelement文本? 还是我可能会在这方面遇到困难的逻辑?如果是,请给我一个主意,如何更好地解决它。

3 个答案:

答案 0 :(得分:1)

我认为基本问题是.each()迭代找到的元素列表,因此在each()函数内部,您一次只能获得一个元素,但是内部代码使用.get()好像elem是元素数组。

您可能会发现使用.then(elems => {...})更容易。

我使用数组映射使用本机textContent(参考Node.textContent)和散布运算符将文本值的数组转换为将cy.get()的结果转换为可使用的数组.map()

it('should...', () => {
  ...
  cy.get('div[class="name"] > a > u').then(elems => {

    const texts = [...elems].map(el => el.textContent.trim());
    let i = 0;
    if (texts[i] === 'My text') {
      ...
    }
    else {
      ...
    }
});

另外,if(expect(i).to.be.oneOf([8, 16, 24]))可能不是一个好主意,因为expect有副作用。我将在其中使用一个简单的布尔表达式,例如if([8, 16, 24].includes(i))expect

答案 1 :(得分:0)

我不确定您要问什么,但是如果您只想获取元素的文本,则可以执行此操作。

<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>

如果我误解了,请发表评论,我会尽力回答。

答案 2 :(得分:0)

要获取实际的字符串对象而不是JQuery对象,可以使用:

cy.get(myElement).then((theElement) => {
  theElement.text() // this returns a string with the element's InnerHTML
});