找不到未禁用的可见字段nil

时间:2018-12-20 08:34:39

标签: angularjs selenium ruby-on-rails-5 capybara

我不知道我在做什么错,因为我对水豚完全陌生。我可以用

找到一个元素
all('.mold_table_input').last
#<Capybara::Node::Element tag="input" path="/html/body/md-content/section/md-content/md-tabs/md-tabs-content-wrapper/md-tab-content/div/div/div/md-card/md-card-content/div/form/md-content/table/tbody/tr[1]/td[1]/input">

但是当我尝试all('.mold_table_input').last.fill_in(with: '02')时,出现以下错误

Capybara::ElementNotFound: Unable to find visible field nil that is not disabled within #<Capybara::Node::Element tag="input" path="/html/body/md-content/section/md-content/md-tabs/md-tabs-content-wrapper/md-tab-content/div/div/div/md-card/md-card-content/div/form/md-content/table/tbody/tr[3]/td[12]/input">

我在前端使用angularjs。另外,当我检查像all('.mold_table_input').last.visible?这样的可见性时,它会返回true

2 个答案:

答案 0 :(得分:1)

您使用的是什么版本的水豚?我猜<3.7,因为那是添加了在要修改的元素上调用fill_in的功能。在3.7之前,它将仅尝试找到有效的后代进行处理。即使您在使用简单的唯一定位器时,即使在3.7+中使用fill_in也不建议您尝试使用 fill_in ‘mold_table_input’, with: ‘02’ ,因为它毫无理由地增加了开销。在这种情况下,您要处理一个唯一的元素定位符(元素ID在HTML页面上应该是唯一的),因此您无需使用‘all(...)。last`,只需这样做

find

在相关说明中,如果确实需要定位某个元素以进行更复杂的交互,那么当您具有可以唯一定位的元素时,您实际上应该更喜欢all而不是findall不仅会更快,而且{{1}}在动态页面上也有一些微妙的限制。

答案 1 :(得分:0)

我不知道这些细节只是为了帮助别人,下面几行就可以了

find('.mold_table_input', match: :first).set('06')

我能够通过首先找到并使用set而不是fill_in来设置输入字段的值