.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'
}
- 究竟是什么 'abcd-1234-qwer-0987',这个会话 ID 是什么东西,它会改变吗?
- 抓取特定元素的最佳方法是什么?因为我猜我的方法是错误的:
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' }
的内容。所以,回答你的问题:
- What is exactly 'abcd-1234-qwer-0987', is this session id kind of stuff and does it change?
可能是某种会话 ID,但我不确定。不管它是什么,您都不需要它来完成您正在做的事情。
- 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' },
考虑到我有多个 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'
}
- 究竟是什么 'abcd-1234-qwer-0987',这个会话 ID 是什么东西,它会改变吗?
- 抓取特定元素的最佳方法是什么?因为我猜我的方法是错误的:
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' }
的内容。所以,回答你的问题:
- What is exactly 'abcd-1234-qwer-0987', is this session id kind of stuff and does it change?
可能是某种会话 ID,但我不确定。不管它是什么,您都不需要它来完成您正在做的事情。
- 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' },