Add tests for multi-statement evaluate_script via IIFE

This commit is contained in:
Thomas Walpole 2019-05-30 10:49:50 -07:00
parent acfda7d41a
commit bdaed0bada
3 changed files with 36 additions and 2 deletions

View File

@ -611,13 +611,23 @@ In drivers which support it, you can easily execute JavaScript:
page.execute_script("$('body').empty()")
```
For simple expressions, you can return the result of the script. Note
that this may break with more complicated expressions:
For simple expressions, you can return the result of the script.
```ruby
result = page.evaluate_script('4 + 4');
```
For more complicated scripts you'll need to write them as one expression.
```ruby
result = page.evaluate_script(<<~JS, 3, element)
(function(n, el){
var val = parseInt(el.value, 10);
return n+val;
})(arguments[0], arguments[1])
JS
```
### <a name="modals"></a>Modals
In drivers which support it, you can accept, dismiss and respond to alerts, confirms and prompts.

View File

@ -34,4 +34,16 @@ Capybara::SpecHelper.spec '#evaluate_script', requires: [:js] do
expect(el).to be_instance_of(Capybara::Node::Element)
expect(el).to eq(@session.find(:css, '#change'))
end
it 'should support multi statement via IIFE' do
@session.visit('/with_js')
@session.find(:css, '#change')
el = @session.evaluate_script(<<~JS)
(function(){
var el = document.getElementById('change');
return el;
})()
JS
expect(el).to eq(@session.find(:css, '#change'))
end
end

View File

@ -774,6 +774,18 @@ Capybara::SpecHelper.spec 'node' do
expect(el).to be_instance_of(Capybara::Node::Element)
expect(el).to eq(change)
end
it 'should support multiple statements via IIFE' do
@session.visit('/with_js')
change = @session.find(:css, '#change') # ensure page has loaded and element is available
res = change.evaluate_script(<<~JS, 3)
(function(n){
var el = this;
return [el, n];
}).apply(this, arguments)
JS
expect(res).to eq [change, 3]
end
end
describe '#evaluate_async_script', requires: %i[js es_args] do