Firefox和Chrome Selenium webdrivers的行为与Capybara和SitePrism不同

时间:2017-08-03 16:01:21

标签: ruby selenium capybara site-prism

我有一个登录页面,其中包含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

1 个答案:

答案 0 :(得分:0)

是否应该有这么大的差异 - 没有。 可以吗 - 是的。

不同的浏览器可以(并且确实)表现不同,JS也可以有不同的效果。话虽如此,您的chromedrivergeckodriver都已过时。升级到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'