@@ -439,29 +439,47 @@ protected function clickByLocator($link)
439439 */
440440 private function clickButton (\DOMNode $ node )
441441 {
442- $ formParams = [];
443- $ buttonName = (string )$ node ->getAttribute ('name ' );
444- $ buttonValue = $ node ->getAttribute ('value ' );
445-
446- if ($ buttonName !== '' && $ buttonValue !== null ) {
447- $ formParams = [$ buttonName => $ buttonValue ];
442+ /**
443+ * First we check if the button is associated to a form.
444+ * It is associated to a form when it has a nonempty form
445+ */
446+ $ formAttribute = $ node ->attributes ->getNamedItem ('form ' );
447+ if (isset ($ formAttribute )) {
448+ $ form = empty ($ formAttribute ->nodeValue ) ? null : $ this ->filterByCSS ('# ' . $ formAttribute ->nodeValue )->getNode (0 );
449+ } else {
450+ // Check parents
451+ $ currentNode = $ node ;
452+ $ form = null ;
453+ while ($ currentNode ->parentNode !== null ) {
454+ $ currentNode = $ currentNode ->parentNode ;
455+ if ($ currentNode ->nodeName === 'form ' ) {
456+ $ form = $ node ;
457+ break ;
458+ }
459+ }
448460 }
449461
450- while ($ node ->parentNode !== null ) {
451- $ node = $ node ->parentNode ;
452- if (!isset ($ node ->tagName )) {
453- // this is the top most node, it has no parent either
454- break ;
462+ if (isset ($ form )) {
463+ $ buttonName = $ node ->getAttribute ('name ' );
464+ if ($ buttonName !== '' ) {
465+ $ formParams = [$ buttonName => $ node ->getAttribute ('value ' )];
466+ } else {
467+ $ formParams = [];
455468 }
456- if ($ node ->tagName === 'a ' ) {
457- $ this ->openHrefFromDomNode ($ node );
458- return true ;
459- } elseif ($ node ->tagName === 'form ' ) {
460- $ this ->proceedSubmitForm (
461- new Crawler ($ node , $ this ->getAbsoluteUrlFor ($ this ->_getCurrentUri ()), $ this ->getBaseUrl ()),
462- $ formParams
463- );
464- return true ;
469+ $ this ->proceedSubmitForm (
470+ new Crawler ($ form , $ this ->getAbsoluteUrlFor ($ this ->_getCurrentUri ()), $ this ->getBaseUrl ()),
471+ $ formParams
472+ );
473+ return true ;
474+ } else {
475+ // Check if the button is inside an anchor.
476+ $ currentNode = $ node ;
477+ while ($ currentNode ->parentNode !== null ) {
478+ $ currentNode = $ currentNode ->parentNode ;
479+ if ($ currentNode ->nodeName === 'a ' ) {
480+ $ this ->openHrefFromDomNode ($ currentNode );
481+ return true ;
482+ }
465483 }
466484 }
467485 throw new TestRuntimeException ('Button is not inside a link or a form ' );
0 commit comments