Rspec 和 watir-webdriver;断言元素不存在

Rspec and watir-webdriver; assert element not present

我正在使用 Rspec 和 watir-webdriver,并且正在努力编写一个通过测试,以便当一个项目在屏幕上被删除时,它 不是 present-- 因此 passes 这是我正在尝试做的事情:

# this method gets the specific item I want to interact with
def get_item(title)
    foo = @browser.div(:text, title).parent.parent
    return foo
end

# This method looks at an element grid that contains all the items
def item_grid_contents
    grid = @browser.div(:class, 'items-grid')
    return grid
end

当我删除该项目时,这些是我尝试编写断言的几种方式:

expect(get_item(title)).not_to be_present # => fails, unable to locate element
expect(item_grid_contents).not_to include(get_item(title)) # => fails, same error

在这种情况下,我希望确保元素 不能 被找到,并且应该通过。 有没有别的写法算pass?

这是因为 #parent 方法使用 javascript 查找创建 Watir 元素的 Selenium 元素。对于大多数元素,Watir 创建一个 xpath 定位器,但延迟加载它,以便在与之交互之前它不必存在。使用此 javascript 调用,它会立即被评估,因此它会立即失败而无法响应 #exists?#present? 方法。

这是一个很好的例子,说明了为什么我不喜欢我们当前的 parent 实现。由于我没有令人信服的理由来推动它,因此我一直在等待代码来更改它。这是一个令人信服的理由。

目前,我认为这对你有用:

@browser.div(:text, title).element(xpath: './ancestor::*[2]')

为什么不检查 div(:text, title) 是否存在?毕竟,如果外部容器(父级)消失了,那么内容(子级)也将消失。

expect(@browser.div(text: title)).not_to be_present

或(不确定我的期望语法就在这里..)

expect(@browser.div(text: title).present?.to be_false

关于 ruby.. 的小提示,您可以通过不使用中间变量来使这些方法更简洁一些。事实上,您甚至可以消除隐含的 'return'(但我们中的一些人喜欢它的可读性)而且大多数编写 Ruby 代码的人都使用两个 space 缩进。所以对于你上面的方法,你可以只使用

def get_item(title)
  return @browser.div(:text, title).parent.parent
end

甚至

def item_grid_contents
  @browser.div(:class, 'items-grid')
end