Selenium with Ruby-无法访问我想要的HTML元素

Selenium with Ruby-无法访问我想要的HTML元素,ruby,selenium,rspec,Ruby,Selenium,Rspec,我遵循SauceLab的Ruby和Selenium指南-这是一本免费的书,可以帮助您结合Rspec教授Selenium。在本书的第一个真实示例中,作者带领我们编写了一个测试脚本,该脚本指向以下链接: 然后,我们的脚本将插入适当的uname和pwd(在页面上的文本中列出…它是tomsmith和SuperSecretPassword!),然后提交表单 上面所有的工作都很有效——然后它进一步介绍了一个断言,以确保我们进入了正确的页面(成功登录后的页面)。即使我按照书中的例子这样做,这个断言也不起作用

我遵循SauceLab的Ruby和Selenium指南-这是一本免费的书,可以帮助您结合Rspec教授Selenium。在本书的第一个真实示例中,作者带领我们编写了一个测试脚本,该脚本指向以下链接:

然后,我们的脚本将插入适当的uname和pwd(在页面上的文本中列出…它是tomsmith和SuperSecretPassword!),然后提交表单

上面所有的工作都很有效——然后它进一步介绍了一个断言,以确保我们进入了正确的页面(成功登录后的页面)。即使我按照书中的例子这样做,这个断言也不起作用。它找不到元素,在这里这样说:

 Failure/Error: expect(@driver.find_element(css: '.flash.success').displayed?)

 Selenium::WebDriver::Error::NoSuchElementError:
   Unable to locate element: .flash.success
 # ./ruby_spec.rb:20:in `block (2 levels) in <top (required)>'
减去稍加修改的rspec语法,这与本书中列出的内容完全相同。本书对失败的一行进行了如下处理,并使用了一些不推荐的语法:

@driver.find_element(css: '.flash.success').displayed?.should be_true
但这也失败了,与上面的错误完全相同。为了进一步证明它是我的expect(),我测试了其他元素的expect()语法,以测试它是否工作/不是问题的根源。相反,问题的根源在于我的脚本没有像书中指出的那样解析css元素。它找不到“.flash.success”的松散术语

所以我去了成功登录页面的页面源代码,找到了一些其他我可以断言的东西。这一点很有吸引力,因为它是成功页面的独特之处:

<div data-alert id='flash' class='flash success'>
        You logged into a secure area!
        <a href="#" class="close">&times;</a>
      </div>
甚至

 expect(@driver.find_element(id: 'flash').displayed?) #line that fails every run

本质上,我有点困惑,我应该如何从成功登录页面中获得一个唯一的元素来正确断言。以上所有的努力(包括我正在学习的示例文本中的努力)对我来说似乎都是合理的。。。但事实并非如此。与其简单地将文本切换到一个有工作示例的文本,我认为对我来说,找出并尝试发现上面的示例不起作用的原因会更有启发性。

什么是
@driver.find_元素(id:'flash')
返回的?如果你(暂时,暂时,代替更好的解决方案)先睡觉(5)?这是完整的代码吗?!你需要写一些东西,比如
expect(..)。说真的
——那么你到底写了什么,错误信息是什么?嘿,汤姆。你走的方向是对的。在我和ta-dah开始工作之前,我引入了睡眠。得到了它将工作的想法,因为我打印到终端页面内容,并看到它是旧的页面内容,它正在显示,在以前的代码迭代)-=。我很伤心。正如我所写的,expect是正确的——在最近的RSpec中,expect可以放在任何旧的布尔表达式周围,例如expect(true或false表达式)。然而,使用expect这种方式可能不太习惯,我也不太确定。是的,欢迎关注所有selenium/相关工具的最大问题。这是QA测试人员每天必须面对100次的问题。没有“银弹”解决方案——懒惰(不好)的方法是欺骗并使用
sleep()
。最好是调查某物的存在。最重要的是,您的断言是由加载的内容触发的。玩一玩,看看你能做些什么。通常,Selenium应该等待页面加载,然后再继续下一步。。。我不知道为什么这在这里不起作用;可能是因为表单提交是以
xhr
的形式进行的?
 expect(@driver.find_element(class: 'flash success').displayed?) #line that fails every run
 expect(@driver.find_element(id: 'flash').displayed?) #line that fails every run