@@ -439,41 +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- if (!empty ($ node ->getAttribute ('form ' ))) {
451- $ formCrawler = $ this ->filterByCSS ('# ' . $ node ->getAttribute ('form ' ));
452- if ($ formCrawler ->count () !== 1 ) {
453- throw new TestRuntimeException ("Found form with id {$ node ->getAttribute ('form ' )} {$ formCrawler ->count ()} times, expected exactly 1 " );
462+ if (isset ($ form )) {
463+ $ buttonName = $ node ->getAttribute ('name ' );
464+ if ($ buttonName !== '' ) {
465+ $ formParams = [$ buttonName => $ node ->getAttribute ('value ' )];
466+ } else {
467+ $ formParams = [];
454468 }
455469 $ this ->proceedSubmitForm (
456- new Crawler ($ formCrawler -> getNode ( 0 ) , $ this ->getAbsoluteUrlFor ($ this ->_getCurrentUri ()), $ this ->getBaseUrl ()),
470+ new Crawler ($ form , $ this ->getAbsoluteUrlFor ($ this ->_getCurrentUri ()), $ this ->getBaseUrl ()),
457471 $ formParams
458472 );
459473 return true ;
460- }
461-
462- while ($ node ->parentNode !== null ) {
463- $ node = $ node ->parentNode ;
464- if (!isset ($ node ->tagName )) {
465- // this is the top most node, it has no parent either
466- break ;
467- }
468- if ($ node ->tagName === 'a ' ) {
469- $ this ->openHrefFromDomNode ($ node );
470- return true ;
471- } elseif ($ node ->tagName === 'form ' ) {
472- $ this ->proceedSubmitForm (
473- new Crawler ($ node , $ this ->getAbsoluteUrlFor ($ this ->_getCurrentUri ()), $ this ->getBaseUrl ()),
474- $ formParams
475- );
476- 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+ }
477483 }
478484 }
479485 throw new TestRuntimeException ('Button is not inside a link or a form ' );
0 commit comments