0

我有一个包含 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该类的 Web 元素:

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)

使用sleeps 进行诊断,结果发现密码文本字段没有被填充,因为焦点没有通过简单地设置到它password_field.set password。唯一的方法是,我可以让测试像chromedriver一样运行,它取消注释行,# password_field.click.

Selenium webdrivers之间应该有这么大的区别吗?毕竟,可以说添加额外click内容更多地代表了人为驱动的行为,另一方面,可以说我必须引入不必要的步骤才能使其发挥作用。

值得注意的宝石版本:

capybara (2.14.4, 2.6.0)
cucumber (2.4.0)
selenium-webdriver (3.4.3)
site_prism (2.9)

网络驱动程序:

chromedriver v2.29
geckodriver v0.14.0
4

1 回答 1

0

应该有这么大的区别吗?不。可以吗?是的。

不同的浏览器可以(并且确实)表现不同,JS 也可以有不同的效果。话虽如此,您的chromedrivergeckodriver都已过时。升级到chromedriver2.31 和geckodriver0.17(在 FF 55 发布之前,0.18 将无法正常工作)并查看是否可以解决差异。

此外,您列出了 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'
于 2017-08-03T16:55:43.273 回答