Skip to content

Commit

Permalink
[rb] update implementation for submitting forms
Browse files Browse the repository at this point in the history
  • Loading branch information
titusfortner committed May 25, 2022
1 parent 9e53690 commit db61990
Show file tree
Hide file tree
Showing 3 changed files with 64 additions and 11 deletions.
13 changes: 11 additions & 2 deletions common/src/web/formPage.html
Original file line number Diff line number Diff line change
Expand Up @@ -106,7 +106,7 @@

<p id="cheeseLiker">I like cheese</p>
<input type="submit" value="Click!"/>

<input type="radio" id="lone_disabled_selected_radio" name="not_a_snack" value="cumberland" checked="checked" disabled="disabled" />Cumberland sausage
</form>

Expand Down Expand Up @@ -150,7 +150,7 @@
<input type="text" value="name" name="x"/>
</div>
<input type="submit" />
</form>
</form>

<!-- Form with disabled form elements -->
<form method="get" action="xhtmlTest.html">
Expand All @@ -170,6 +170,15 @@
<label for="checkbox-with-label" id="label-for-checkbox-with-label">Label</label><input type="checkbox" id="checkbox-with-label" />
</p>
</form>

<form method="get" action="resultPage.html" name="submit_id">
<input type="submit" id="submit" value="Submit a Submit ID Button"/>
</form>

<form method="get" action="resultPage.html" name="submit_name">
<input type="submit" name="submit" value="Submit a Submit ID Button"/>
</form>

<input id="vsearchGadget" name="SearchableText" type="text" size="18" value="" title="Hvad søger du?" accesskey="4" class="inputLabel" />
</body>
</html>
17 changes: 13 additions & 4 deletions rb/lib/selenium/webdriver/remote/bridge.rb
Original file line number Diff line number Diff line change
Expand Up @@ -425,10 +425,19 @@ def clear_element(element)
end

def submit_element(element)
form = find_element_by('xpath', "./ancestor-or-self::form", [:element, element])
execute_script("var e = arguments[0].ownerDocument.createEvent('Event');" \
"e.initEvent('submit', true, true);" \
'if (arguments[0].dispatchEvent(e)) { arguments[0].submit() }', form.as_json)
script = "var form = arguments[0];\n" \
"while (form.nodeName != \"FORM\" && form.parentNode) {\n" \
" form = form.parentNode;\n" \
"}\n" \
"if (!form) { throw Error('Unable to find containing form element'); }\n" \
"if (!form.ownerDocument) { throw Error('Unable to find owning document'); }\n" \
"var e = form.ownerDocument.createEvent('Event');\n" \
"e.initEvent('submit', true, true);\n" \
"if (form.dispatchEvent(e)) { HTMLFormElement.prototype.submit.call(form) }\n"

execute_script(script, Element::ELEMENT_KEY => element)
rescue Error::JavascriptError
raise Error::UnsupportedOperationError, "To submit an element, it must be nested inside a form element"
end

#
Expand Down
45 changes: 40 additions & 5 deletions rb/spec/integration/selenium/webdriver/element_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -40,11 +40,46 @@ module WebDriver
expect { driver.find_element(id: 'other_contents').click }.to raise_error(Error::ElementClickInterceptedError)
end

it 'should submit' do
driver.navigate.to url_for('formPage.html')
wait_for_element(id: 'submitButton')
expect { driver.find_element(id: 'submitButton').submit }.not_to raise_error
reset_driver!
describe '#submit' do
it 'valid submit button' do
driver.navigate.to url_for('formPage.html')
driver.find_element(id: 'submitButton').submit

expect(driver.title).to eq('We Arrive Here')
end

it 'any input element in form' do
driver.navigate.to url_for('formPage.html')
driver.find_element(id: 'checky').submit

expect(driver.title).to eq('We Arrive Here')
end

it 'any element in form' do
driver.navigate.to url_for('formPage.html')
driver.find_element(id: 'form > p').submit

expect(driver.title).to eq('We Arrive Here')
end

it 'button with id submit' do
driver.navigate.to url_for('formPage.html')
driver.find_element(id: 'submit').submit

expect(driver.title).to eq('We Arrive Here')
end

it 'button with name submit' do
driver.navigate.to url_for('formPage.html')
driver.find_element(name: 'submit').submit

expect(driver.title).to eq('We Arrive Here')
end

it 'errors with button outside form' do
driver.navigate.to url_for('formPage.html')
expect { driver.find_element(name: 'SearchableText').submit }.to raise_error(Error::UnsupportedOperationError)
end
end

it 'should send string keys' do
Expand Down

0 comments on commit db61990

Please sign in to comment.