我有一个登录页面,其中包含2个文本字段和一个提交按钮。提交按钮仅在正确填写文本字段时启用。
<fieldset>
<div class="control">
<input type="email" name="username" class="" value="Email">
<span class="input-icon"></span>
</div>
<div class="control">
<input type="text" name="password" class="" value="Password">
<span class="input-icon"></span>
</div>
<input type="submit" id="signInFormSubmitButton" disabled="" value="Sign In">
</fieldset>
我正在使用Capybara和SitePrism来识别SignInPage
类的网页元素:
class SignInPage < SitePrism::Page
element :username_field, "input[name='username']"
element :password_field, "input[name='password']"
element :sign_in_button, "input[id='signInFormSubmitButton']"
并与同一类方法中的那些进行交互:
def signInWith(username, password)
username_field.set username
# password_field.click
password_field.set password
end
我的步骤定义然后调用该方法:
When(/^I attempt to sign in with "([^"]*)" and "([^"]*)"$/) do |username, password|
@home_page.header.signIn
@sign_in_page.signInWith(username, password)
end
使用 chromedriver 运行测试时,将填写所有文本字段,启用“登录”按钮,然后通过其他方法验证并按下该按钮。 使用 geckodriver ,我收到以下错误:
Element is not Enabled (Selenium::WebDriver::Error::InvalidElementStateError)
使用sleep
进行诊断,结果显示密码文本字段未填充,因为仅使用password_field.set password
未将焦点设置为该字段。唯一的方法是,我可以让测试按照 chromedriver 进行操作,取消注释行# password_field.click
。
Selenium网络驱动程序之间应该有这么大的差异吗?毕竟,可以说添加额外的click
代表了更多的人为驱动行为,另一方面,可以说我必须引入不必要的步骤才能使其发挥作用。 / p>
值得注意的宝石版本:
capybara (2.14.4, 2.6.0)
cucumber (2.4.0)
selenium-webdriver (3.4.3)
site_prism (2.9)
webdrivers:
chromedriver v2.29
geckodriver v0.14.0
答案 0 :(得分:0)
是否应该有这么大的差异 - 没有。 可以吗 - 是的。
不同的浏览器可以(并且确实)表现不同,JS也可以有不同的效果。话虽如此,您的chromedriver
和geckodriver
都已过时。升级到chromedriver
2.31和geckodriver
0.17(0.18在FF 55发布之前无法正常工作),看看是否能解决这个问题。
此外,您列出了两个版本的Capybara - 希望您实际上没有使用Capybara 2.6.0运行其中一个测试 - 这也大大过时了。
作为最终提示(与您的问题无关),使用SitePrism时,您可以利用Capybara选择器使您的元素定义更清晰,并且需要更少的直接CSS / XPath
class SignInPage < SitePrism::Page
element :username_field, :field, 'username'
element :password_field, :field, 'password'
element :sign_in_button, :button, 'signInFormSubmitButton'