NightwatchJS中的xPath问题

时间:2016-12-14 16:03:45

标签: javascript xpath nightwatch.js custom-selectors

我正在尝试测试我在NightwatchJS中创建的命令,但我不断收到与选择器相关的错误。错误是预期的'可见'但得到了:'找不到'"。这似乎与第二个选择器的xPath不正确有关。 enter image description here 选择器函数使用xPath并使用Nightwatch方法.waitForElementVisible测试元素。我在我正在使用的命令之外创建了一个公共命令(基本上只是一个选择器),它使用文件名作为参数成功选择元素。问题是第二个选择器(shoeboxDropdown),它接受第一个选择器(shoeboxSelectButton)并添加一个/ div。 shoeboxDropdown选择器必须与shoeboxSelectButton相关。我想要做的是选择按钮,然后单击该按钮的下拉菜单。如果你看一下xPaths,你可能会看到我的delima。

shoeboxSelectButton:

  "//*[@id=\"sidebar-plugins\"]/div[1]/div[3]/div/div/div[2]/div[1]/ul/li/div[span/text()='" + filename + "']"

shoeboxDropdown:

//*[@id="sidebar-plugins"]/div[1]/div[3]/div/div/div[2]/div[1]/ul/li/div[2]

它们都位于相同的列表项li下,但位于单独的divs下。文件名的文本位于div[1],而下拉菜单位于div[2]。如何使用第一个选择器使用xPath获取第二个?

shoeboxSelectButton = require "../Common/shoeboxSelectButton"

exports.command = (filename) ->
    mappx = @page.mappx()

    shoeboxDropdown = () ->
      shoeboxSelectButton(filename) + "/div" 

enter image description here

2 个答案:

答案 0 :(得分:1)

尝试使用父选择器,然后索引到第二个div。像这样......

“// * [@ ID = \” 侧边栏插件\“] /格http://example.com/new-directory/my-page / DIV [3] / DIV / DIV / DIV [2] / DIV 1 / UL / li / div [span / text()='“+ filename +”'] /../ div [2]“

1我个人使用https://www.simple-talk.com/dotnet/net-framework/xpath-css-dom-and-selenium-the-rosetta-stone/来找出其中一些类型的案例。

答案 1 :(得分:1)

好的 - 经过多次试验,我能够弄明白。似乎添加//允许从初始路径派生路径。我的解决方案看起来有点像这样,我也可以将它应用到其他选民身上。首先,我必须为我的shoeboxSelectButton选择器调整xPath(注意:这是在Coffeescript中):

module.exports = (filename) ->
"//*[@id=\"sidebar-plugins\"]/div[1]/div[3]/div/div/div[2]/div[1]/ul/li[.//span/text()='" + filename + "']"

然后,更改了我的命令中的代码,以导出shoeboxDropdown(和shoeboxRemoveButton)的选择器,如下所示:

shoeboxSelectButton = require "../Common/shoeboxSelectButton"

exports.command = (filename) ->
    mappx = @page.mappx()

shoeboxDropdown = () ->
    shoeboxSelectButton(filename) + "//em"

shoeboxRemoveButton = () ->
    shoeboxSelectButton(filename) + "//ul/li[3]/a"

最后,我只需要在测试文件中进行一次调用即可。有用!希望这可以帮助将来的某个人。

browser.ShoeboxPanel.deleteShoebox "Typical"