我查看了this question有关CSS选择器的问题。接受的答案是完全离开nightwatch.js。我希望情况不是这样,但我遇到了问题。
我已升级到最新的nightwatch.js v0.9.14,但无法通过jQuery找到屏幕上的元素。
使用下面的选择器(必要的层次结构,因为它在jqGrid中):
.click("#MedicalHistoryAmendment_sheet tbody tr:eq(1) > td:eq(4) > select")
我明白了:
ERROR: Unable to locate element: "#MedicalHistoryAmendment_sheet tbody tr:eq(1) > td:eq(4) > select
using: css selector
同时尝试this question的选择器方法(由于ids是动态的,所以不愿意这样做):
.click('select[id="null_z01rsnload_inst_ref"]')
失败:
ERROR: Unable to locate element: "select[id="null_z01rsnload_inst_ref"]" using: css selector
在控制台中使用jQuery:
$("#MedicalHistoryAmendment_sheet tbody tr:eq(1) > td:eq(4) > select")
返回:
[select#null_z01rsnload_inst_ref.editable, prevObject: init(1), context: document, selector: "#MedicalHistoryAmendment_sheet tbody tr:eq(1) > td:eq(4) > select"]
之前我遇到过类似的问题(尤其是选择和他们的选项)but the method mentioned in the answer by 79E09796 has worked for me previously。
这是在Chrome(我们的主要目标,我们目前没有对其他平台进行自动化测试)使用chromedriver.exe 2.28版。它不在iframe内。
在nightwatch命令行中添加“--verbose”给了我:
INFO Request: POST /wd/hub/session/50a51b48-bce9-425d-a132-2d0407c8ac21/elements
- data: {"using":"css selector","value":"#MedicalHistoryAmendment_sheet tbody tr:eq(1) > td:eq(7) select"}
- headers: {"Content-Type":"application/json; charset=utf-8","Content-Length":98}
ERROR Response 500 POST /wd/hub/session/50a51b48-bce9-425d-a132-2d0407c8ac21/elements (1019ms) { sessionId: '50a51b48-bce9-425d-a132-2d0407c8ac21',
status: 32,
value:
{ message: 'invalid selector: An invalid or illegal selector was specified\n
..<snip>..
非常感谢任何进一步的想法!
答案 0 :(得分:0)
正如@BoltClock所说eq()
运算符不是一个有效的CSS选择器,它是jQuery特有的。我改为使用nth-child()
代替。
所以:
.assert.elementPresent("#MedicalHistoryAmendment_sheet tbody tr:eq(1) > td:eq(7) select")
需要:
.assert.elementPresent("#MedicalHistoryAmendment_sheet tbody tr:nth-child(2) > td:nth-child(8) select")
要进行更改,您需要将索引增加1,并且还要记住它可能会获取额外的元素depending on the structure。
此类别中仅限jQuery的其他选择器为gt()
,lt()
感谢所有人的帮助。