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
我正在使用 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