.elements() 如何在守夜人中工作?

How .elements() works in nightwatch?

考虑到我有多个 trs,我想选择一个并通过单击绑定到它的编辑按钮来编辑其中的值。

我正在做这样的事情:

browser.elements('css selector', '#someId  tr', elements => {
  elements.value.forEach(val => {
    console.log(val)
  }

我得到这样的结果:

{
  'abcd-1234-qwer-0987': 'some id'
},
{
  'abcd-1234-qwer-0987': 'some other id'
}
  1. 究竟是什么 'abcd-1234-qwer-0987',这个会话 ID 是什么东西,它会改变吗?
  2. 抓取特定元素的最佳方法是什么?因为我猜我的方法是错误的:elements.value[1]['abcd-1234-qwer-0987']

它的 return 元素项是 Web 元素 json 对象。 Web 元素 ID

https://nightwatchjs.org/api/commands/#elements

1.What 正好是 'abcd-1234-qwer-0987',这个会话 ID 是什么东西,它会改变吗?

是的,它会根据会话发生变化

2.what 是抓取特定元素的最佳方式

参考以下

browser.elements('css selector', '#someId  tr', elements => {
 console.log(elements);
elements.value.forEach(element =>{
let key = Object.keys(element)[0];
let ElementIDvalue = element[key];
console.log("key = ",  key);
console.log("WebElementIDvalue = ", ElementIDvalue);
})
});

当我 运行 browser.elements 并将条目记录在 elements.value 数组中时,我得到类似 { ELEMENT: '5' } 的内容。所以,回答你的问题:

  1. What is exactly 'abcd-1234-qwer-0987', is this session id kind of stuff and does it change?

可能是某种会话 ID,但我不确定。不管它是什么,您都不需要它来完成您正在做的事情。

  1. What is the best way to grab particular element?

如果我尝试 select 几个相似元素中的一个,我的代码最终看起来像这样:

browser.elements('css selector', '#someId', result => {
  // index is defined somewhere else
  browser.elementIdClick(result.value[index].ELEMENT, () => {
    // whatever you want to do after you click the element.
  });
});

如果这对您不起作用,您可以分享一下 OS 和您 运行 使用的浏览器,以及您的守夜人配置文件吗?

我找到的关于您尝试做的事情的所有文档都说我应该能够使用 obj.ELEMENT 但他们没有说的是它需要设置 w3c在你的守夜人配置中设置为 false。

上下文示例:

  test_settings: {
    default: {
      end_session_on_fail: false,
      disable_error_log: false,
      launch_url: 'http://localhost:3000',

      desiredCapabilities : {
        browserName : 'chrome',
        'goog:chromeOptions' : {
          // More info on Chromedriver: https://sites.google.com/a/chromium.org/chromedriver/
          //
          // w3c:false tells Chromedriver to run using the legacy JSONWire protocol (not required in Chrome 78)
          w3c: true,
          args: [
            '--auto-open-devtools-for-tabs',
            //'--no-sandbox',
. . .

这是我如何使用它的示例:

    .elements('css selector', `${targetNodeSelector} #nodeCard`, nodeContents => {
      console.log(nodeContents.value)
      nodeContents.value.forEach(nodeContent => {
        console.log(nodeContent.ELEMENT)
        // browser.elementIdText(nodeContent.ELEMENT, function (result) {
        //   console.log('\n' + result.value)
        // })
      })
    })

这将显示正确的 keys/values:

[
  { ELEMENT: '0.944080972569816-108' },
  { ELEMENT: '0.944080972569816-109' },
  { ELEMENT: '0.944080972569816-110' },