Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails Javascript测试在从Selenium切换到Poltergeist时中断_Ruby On Rails_Selenium Webdriver_Capybara_Integration Testing_Poltergeist - Fatal编程技术网

Ruby on rails Javascript测试在从Selenium切换到Poltergeist时中断

Ruby on rails Javascript测试在从Selenium切换到Poltergeist时中断,ruby-on-rails,selenium-webdriver,capybara,integration-testing,poltergeist,Ruby On Rails,Selenium Webdriver,Capybara,Integration Testing,Poltergeist,我有一些功能测试,一旦我从Selenium切换到Poltergeist,这些测试就完全崩溃了。有趣的是,我正在对第三方外部API Mailgun进行AJAX调用以进行电子邮件验证时,破坏发生了 使用Selenium,所有测试都通过。有了恶作剧精神,测试的行为方式与预期完全相反。换句话说,使用恶作剧,所有有效的电子邮件都被标记为无效,反之亦然。除了一些恶作剧的语法,我的测试中没有任何改变 是什么原因可能会导致Poltergeist未能通过与Selenium一起通过的JS测试 编辑以包含示例代码:

我有一些功能测试,一旦我从Selenium切换到Poltergeist,这些测试就完全崩溃了。有趣的是,我正在对第三方外部API Mailgun进行AJAX调用以进行电子邮件验证时,破坏发生了

使用Selenium,所有测试都通过。有了恶作剧精神,测试的行为方式与预期完全相反。换句话说,使用恶作剧,所有有效的电子邮件都被标记为无效,反之亦然。除了一些恶作剧的语法,我的测试中没有任何改变

是什么原因可能会导致Poltergeist未能通过与Selenium一起通过的JS测试

编辑以包含示例代码:

功能测试:

scenario "with missing required parameters" do
  visit new_subscriber_path
  fill_in 'subscriber_firstname', with: ''
  fill_in 'subscriber_lastname', with: 'Appleseed'
  fill_in 'subscriber_account_attributes_email', with: 'john@yahoo.com'
  fill_in 'subscriber_account_attributes_password', with: 'test123'
  fill_in 'subscriber_account_attributes_password_confirmation', with: 'test123'
  click_button 'Next'

  page.should have_selector('.error', text: "can't be blank")
  expect(current_path).to eq subscribers_path
end
输出:(此测试通过,没有硒问题)

Mailgun验证程序实现:

//= require mailgun_validator/mailgun_validator

var MailgunEmailValidator = function(emailTextField) {
  this.htmlElements = {
    emailField: $(emailTextField),
    form: $(emailTextField.form),
    errorField: $(emailTextField).siblings('.error')
  }
};

MailgunEmailValidator.PublicKey = 'pubkeyfoo';

MailgunEmailValidator.prototype.focusoutValidation = function () {
  var _this = this;
  $(_this.htmlElements.emailField).focusout(function() {
    _this.htmlElements.emailField.mailgun_validator({
      api_key: MailgunEmailValidator.PublicKey,
      success: function(data) {
        console.log(data)
        _this.isEmailValid = data.is_valid;
        if (_this.isEmailValid) {
          _this.showSuccess(data.did_you_mean);
        } else {
          _this.showError();
        }
      }
    });
  });
};

MailgunEmailValidator.prototype.prepopulatedFieldValidation = function() {
  var _this = this;
  if(_this.htmlElements.emailField[0].defaultValue) {
    _this.htmlElements.emailField.mailgun_validator({
      api_key: MailgunEmailValidator.PublicKey,
      success: function(data) {
        _this.isEmailValid = data.is_valid;
        if (_this.isEmailValid) {
          _this.showSuccess(data.did_you_mean);
        } else {
          _this.showError();
        }
      }
    });
  }
}

MailgunEmailValidator.prototype.showSuccess = function(didYouMean) {
  var _this = this,
      text = '';
  if(didYouMean) {
    text = '<font color="green">Address is valid. (Though did you mean ' + didYouMean + ')</font>';
  }
  if (_this.htmlElements.errorField.length == 0) {
    _this.htmlElements.errorField = $('<div>', {
      'class': 'error'
    });
  }
  _this.htmlElements.emailField.after(_this.htmlElements.errorField.html(text));
};

MailgunEmailValidator.prototype.showError = function() {
  var _this = this;
  if (_this.htmlElements.errorField.length == 0) {
    _this.htmlElements.errorField = $('<div>', {
      'class': 'error'
    });
  }
  _this.htmlElements.emailField.after(_this.htmlElements.errorField.text("This doesn't seem like a valid email address."));
};

MailgunEmailValidator.prototype.bindPreventInvalidEmailFormSubmissionEvent = function() {
  var _this = this;
  _this.htmlElements.form.on('submit', function(event) {
    if (!_this.isEmailValid) {
      event.preventDefault();
      _this.showError();
      _this.htmlElements.emailField[0].scrollIntoView();
    }
  });
};

MailgunEmailValidator.prototype.bindEvents = function() {
  this.bindPreventInvalidEmailFormSubmissionEvent();
};

MailgunEmailValidator.prototype.init = function() {
  this.focusoutValidation();
  this.prepopulatedFieldValidation();
  this.bindEvents();
};

MailgunEmailValidator.init = function() {
  this.emailFields = $('.mailgun');
  this.emailFields.each(function() {
    new MailgunEmailValidator(this).init();
  });
}

mailgun API是通过https实现的。PhantomJS(由poltergeist使用)可能在SSL和配置方面存在一些问题。如果在创建poltergeist驱动程序时为phantomjs指定了忽略ssl错误选项,那么它应该可以工作

Capybara.register_driver :poltergeist do |app|
  Capybara::Poltergeist::Driver.new(app, phantomjs_options: ['--ignore-ssl-errors=true'])
end

您可能还需要根据服务器设置指定“--ssl protocol=TLSv1”选项。

如果您至少没有包含部分代码,则很难指望有人提供帮助。你现在的问题太宽泛了,我想这更多的是一个理论问题,关于恶鬼如何在JS中发挥作用。我很乐意包含代码,但预先警告,这是相当标准的水豚。它将比水豚、恶灵或硒更容易追踪到有bug的地方。没问题。代码包含在编辑中,谢谢!如果你增加水豚的默认等待时间,它会通过吗?我只能认为ajax还没有完成运行。
//= require mailgun_validator/mailgun_validator

var MailgunEmailValidator = function(emailTextField) {
  this.htmlElements = {
    emailField: $(emailTextField),
    form: $(emailTextField.form),
    errorField: $(emailTextField).siblings('.error')
  }
};

MailgunEmailValidator.PublicKey = 'pubkeyfoo';

MailgunEmailValidator.prototype.focusoutValidation = function () {
  var _this = this;
  $(_this.htmlElements.emailField).focusout(function() {
    _this.htmlElements.emailField.mailgun_validator({
      api_key: MailgunEmailValidator.PublicKey,
      success: function(data) {
        console.log(data)
        _this.isEmailValid = data.is_valid;
        if (_this.isEmailValid) {
          _this.showSuccess(data.did_you_mean);
        } else {
          _this.showError();
        }
      }
    });
  });
};

MailgunEmailValidator.prototype.prepopulatedFieldValidation = function() {
  var _this = this;
  if(_this.htmlElements.emailField[0].defaultValue) {
    _this.htmlElements.emailField.mailgun_validator({
      api_key: MailgunEmailValidator.PublicKey,
      success: function(data) {
        _this.isEmailValid = data.is_valid;
        if (_this.isEmailValid) {
          _this.showSuccess(data.did_you_mean);
        } else {
          _this.showError();
        }
      }
    });
  }
}

MailgunEmailValidator.prototype.showSuccess = function(didYouMean) {
  var _this = this,
      text = '';
  if(didYouMean) {
    text = '<font color="green">Address is valid. (Though did you mean ' + didYouMean + ')</font>';
  }
  if (_this.htmlElements.errorField.length == 0) {
    _this.htmlElements.errorField = $('<div>', {
      'class': 'error'
    });
  }
  _this.htmlElements.emailField.after(_this.htmlElements.errorField.html(text));
};

MailgunEmailValidator.prototype.showError = function() {
  var _this = this;
  if (_this.htmlElements.errorField.length == 0) {
    _this.htmlElements.errorField = $('<div>', {
      'class': 'error'
    });
  }
  _this.htmlElements.emailField.after(_this.htmlElements.errorField.text("This doesn't seem like a valid email address."));
};

MailgunEmailValidator.prototype.bindPreventInvalidEmailFormSubmissionEvent = function() {
  var _this = this;
  _this.htmlElements.form.on('submit', function(event) {
    if (!_this.isEmailValid) {
      event.preventDefault();
      _this.showError();
      _this.htmlElements.emailField[0].scrollIntoView();
    }
  });
};

MailgunEmailValidator.prototype.bindEvents = function() {
  this.bindPreventInvalidEmailFormSubmissionEvent();
};

MailgunEmailValidator.prototype.init = function() {
  this.focusoutValidation();
  this.prepopulatedFieldValidation();
  this.bindEvents();
};

MailgunEmailValidator.init = function() {
  this.emailFields = $('.mailgun');
  this.emailFields.each(function() {
    new MailgunEmailValidator(this).init();
  });
}
Capybara.javascript_driver = :poltergeist
Capybara.register_driver :poltergeist do |app|
  Capybara::Poltergeist::Driver.new(app, phantomjs_options: ['--ignore-ssl-errors=true'])
end