seleniumを起動
java -jar /path/to/selenium-server-standalone-2.39.0.jar -role hub
phantomjsを起動
phantomjs --webdriver=8080 --webdriver-selenium-grid-hub=http://127.0.0.1:4444
seleniumを起動
java -jar /path/to/selenium-server-standalone-2.39.0.jar -role hub
phantomjsを起動
phantomjs --webdriver=8080 --webdriver-selenium-grid-hub=http://127.0.0.1:4444
Handler handler = new StreamHandler(){ | |
//初期化ブロック | |
{ | |
setOutputStream(System.out); | |
setLevel(Level.ALL); | |
} | |
@Override | |
public void publish(LogRecord record){ | |
super.publish(record); |
//POSTを投げる側のコード | |
HttpClient httpClient = HttpClientBuilder.create().build(); | |
HttpPost httpPost = new HttpPost("http://127.0.0.1:8080/test/post"); | |
MultipartEntityBuilder params = MultipartEntityBuilder.create(); | |
params.setMode(HttpMultipartMode.BROWSER_COMPATIBLE); | |
//ContentTypeをセットしないと文字化けします | |
params.addTextBody("text", "マルチバイトテキスト", ContentType.create("text/plain", MIME.UTF8_CHARSET)); |
非同期処理を含むイベントが連続で発火されて、それを、同期に実行したい(発火された順番で必ず前の処理が終わってから実行したい)時に使えるテクニック。めちゃめちゃに実行される非同期処理を一列に整列させるイメージです。
var promises = [];
promises.push(Promise.resolve());
promises.push(
promises.shift().then(() => {
return new Promise(resolve => {
setTimeout(() => {
import webdriver from 'selenium-webdriver' | |
import test from 'selenium-webdriver/testing' | |
test.describe('Test', () => { | |
test.it('with headless chrome.', () => { | |
const chromeCapabilities = webdriver.Capabilities.chrome(); | |
chromeCapabilities.set('chromeOptions', { | |
'args': ['--headless', '--disable-gpu'] | |
}); | |
driver = new webdriver.Builder() |
const obj = { | |
foobar: function(){} | |
} | |
obj.foobar.toString() == (function(){}).toString() //false | |
obj.foobar.toString() == (function foobar(){}).toString() //true | |
obj.foobar.toString() //function foobar() {} |
Both getAttribute
and isSelected
are asynchronous methods, so my solution has become such complicated. Does anyone know a simpler solution?
# app/validators/array_length_validator.rb | |
class ArrayLengthValidator < ActiveModel::Validations::LengthValidator | |
def initialize(options) | |
ActiveModel::Validations::LengthValidator::MESSAGES.each do |key, value| | |
options[value] = I18n.t("errors.messages.array_#{value}") | |
end | |
super(options) | |
end | |
end |
# app/models/forms/recruit.rb | |
class Forms::Recruit | |
include ActiveModel::Model | |
attr_accessor :job_types | |
validates :job_types, presence: true, white_list: {list: JOB_TYPES, allow_blank: true} | |
end |