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 |