From a3d2f41cd392c9842e3b37be673ec0e287c58ce8 Mon Sep 17 00:00:00 2001 From: Alex Rodionov Date: Thu, 26 Jul 2018 14:49:59 +0700 Subject: [PATCH] Allow to use multiple files with file detector --- common/src/web/upload_multiple.html | 46 +++++++++++++++++++ .../selenium/webdriver/remote/oss/bridge.rb | 7 ++- .../selenium/webdriver/remote/w3c/bridge.rb | 7 ++- .../selenium/webdriver/remote/element_spec.rb | 36 +++++++++++---- .../webdriver/spec_support/rack_server.rb | 7 ++- 5 files changed, 88 insertions(+), 15 deletions(-) create mode 100644 common/src/web/upload_multiple.html diff --git a/common/src/web/upload_multiple.html b/common/src/web/upload_multiple.html new file mode 100644 index 0000000000000..f12232f09408b --- /dev/null +++ b/common/src/web/upload_multiple.html @@ -0,0 +1,46 @@ + + + + Multiple Upload Form + + + +
+
+ Enter a file to upload: +
+
+
+ + +
+ + + diff --git a/rb/lib/selenium/webdriver/remote/oss/bridge.rb b/rb/lib/selenium/webdriver/remote/oss/bridge.rb index 1b79e29506783..f1e097d5d889b 100755 --- a/rb/lib/selenium/webdriver/remote/oss/bridge.rb +++ b/rb/lib/selenium/webdriver/remote/oss/bridge.rb @@ -363,8 +363,11 @@ def send_keys_to_active_element(key) def send_keys_to_element(element, keys) if @file_detector - local_file = @file_detector.call(keys) - keys = upload(local_file) if local_file + local_files = keys.first.split("\n").map { |key| @file_detector.call(key) }.compact + if local_files.any? + keys = local_files.map { |local_file| upload(local_file) } + keys = keys.join("\n") + end end execute :send_keys_to_element, {id: element}, {value: Array(keys)} diff --git a/rb/lib/selenium/webdriver/remote/w3c/bridge.rb b/rb/lib/selenium/webdriver/remote/w3c/bridge.rb index b79f577603634..8f95bd61c1528 100755 --- a/rb/lib/selenium/webdriver/remote/w3c/bridge.rb +++ b/rb/lib/selenium/webdriver/remote/w3c/bridge.rb @@ -360,8 +360,11 @@ def click_element(element) def send_keys_to_element(element, keys) if @file_detector - local_file = @file_detector.call(keys) - keys = [upload(local_file)] if local_file + local_files = keys.first.split("\n").map { |key| @file_detector.call(key) }.compact + if local_files.any? + keys = local_files.map { |local_file| upload(local_file) } + keys = Array(keys.join("\n")) + end end # Keep .split(//) for backward compatibility for now diff --git a/rb/spec/integration/selenium/webdriver/remote/element_spec.rb b/rb/spec/integration/selenium/webdriver/remote/element_spec.rb index 3168d2a61ec1f..ffdea042ba522 100644 --- a/rb/spec/integration/selenium/webdriver/remote/element_spec.rb +++ b/rb/spec/integration/selenium/webdriver/remote/element_spec.rb @@ -19,25 +19,41 @@ module Selenium module WebDriver - describe Element, only: {driver: :remote, browser: %i[chrome ff_esr firefox]} do + describe Element, only: {driver: :remote} do before do - driver.file_detector = ->(_str) { __FILE__ } + driver.file_detector = ->(filename) { File.join(__dir__, filename) } end after do driver.file_detector = nil end - it 'uses the file detector' do - driver.navigate.to url_for('upload.html') + context 'when uploading one file', only: {browser: %i[chrome ff_esr firefox ie]} do + it 'uses the file detector' do + driver.navigate.to url_for('upload.html') - driver.find_element(id: 'upload').send_keys('random string') - driver.find_element(id: 'go').submit - wait.until { driver.find_element(id: 'upload_label').displayed? } + driver.find_element(id: 'upload').send_keys('element_spec.rb') + driver.find_element(id: 'go').submit + wait.until { driver.find_element(id: 'upload_label').displayed? } - driver.switch_to.frame('upload_target') - body = driver.find_element(xpath: '//body') - expect(body.text).to include('uses the set file detector') + driver.switch_to.frame('upload_target') + body = driver.find_element(xpath: '//body') + expect(body.text.scan('Licensed to the Software Freedom Conservancy').count).to eq(3) + end + end + + context 'when uploading multiple files', only: {browser: %i[chrome ie]} do + it 'uses the file detector' do + driver.navigate.to url_for('upload_multiple.html') + + driver.find_element(id: 'upload').send_keys("driver_spec.rb\nelement_spec.rb") + driver.find_element(id: 'go').submit + wait.until { driver.find_element(id: 'upload_label').displayed? } + + driver.switch_to.frame('upload_target') + body = driver.find_element(xpath: '//body') + expect(body.text.scan('Licensed to the Software Freedom Conservancy').count).to eq(4) + end end end end # WebDriver diff --git a/rb/spec/integration/selenium/webdriver/spec_support/rack_server.rb b/rb/spec/integration/selenium/webdriver/spec_support/rack_server.rb index f8825b25487ca..b4d2565d7ff2a 100644 --- a/rb/spec/integration/selenium/webdriver/spec_support/rack_server.rb +++ b/rb/spec/integration/selenium/webdriver/spec_support/rack_server.rb @@ -118,7 +118,12 @@ def call(env) case env['PATH_INFO'] when '/common/upload' req = Rack::Request.new(env) - body = req['upload'][:tempfile].read + body = case req['upload'] + when Array + req['upload'].map { |upload| upload[:tempfile].read }.join("\n") + when Hash + req['upload'][:tempfile].read + end [200, {'Content-Type' => 'text/html'}, [body]] else