我已经使用以下html堆栈创建了自定义上传表单:
<form> <label></label> <input type="file"> </form>
文件字段通过CSS显示:none属性隐藏.所以当用户点击标签(这是自定义样式)时,文件附加对话框被用户调用.
在我的功能测试中,由于输入字段被隐藏,我无法附加文件.我已经尝试了几种可能的解决方案,但是他们都没有工作:
find(:xpath,'//input',visible: false).set(some_file_path)
要么
within('form') do attach_file(:input,some_file_path,visible: false) end
还有很多人.所有的时候,我最终都以失败点击元素在未知位置错误.一旦我删除与输入字段重叠的标签,使其可见,并运行我的规格一切通行证.所以这里的问题是:
>输入文件字段显示:无属性(因此无法找到)
>有一个标签与隐藏的文件字段重叠(可能)
有没有办法使Capybara与Capybara-webkit驱动程序以一种理智的方式处理这种微妙的情况?
解决方法
使用capybara-webkit,您可以告诉驱动程序在页面的上下文中运行任何您想要的JavaScript,因此您可以编写一些自定义内容来隐藏可见性问题:
script = "$('thelabel').toggle(); " # hide the label script << "$('myfield').toggle();" # show your field page.driver.browser.execute_script(script)
这是伪代码,但您应该可以做一些类似的操作,使该字段可见,然后再调用attach_file.
也就是说,每次(至少我至少)在我的测试中做了一些这样的事情,这是一个好主意,快点,问是否是测试或需要修复的界面.如果您对界面感到满意,您应该可以使用像上述那样的小型js代码段来获取元素,以便您的测试可见.
更新:
对这种行为的支持已经变得越来越广泛,现在已经在capybara标准化了,所以你可以:
page.execute_script(script)
这个较短的版本应该适用于capybara 2.x和最近版本的capybara-webkit或poltergeist,这是我现在使用的较低依赖性的替代方案.
还有一个合作伙伴的方法,evaluate_script:
result = page.evaluate_script('4 + 4');
希望这可以帮助!