@@ -439,41 +439,47 @@ protected function clickByLocator($link)
439
439
*/
440
440
private function clickButton (\DOMNode $ node )
441
441
{
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
+ }
448
460
}
449
461
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 = [];
454
468
}
455
469
$ this ->proceedSubmitForm (
456
- new Crawler ($ formCrawler -> getNode ( 0 ) , $ this ->getAbsoluteUrlFor ($ this ->_getCurrentUri ()), $ this ->getBaseUrl ()),
470
+ new Crawler ($ form , $ this ->getAbsoluteUrlFor ($ this ->_getCurrentUri ()), $ this ->getBaseUrl ()),
457
471
$ formParams
458
472
);
459
473
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
+ }
477
483
}
478
484
}
479
485
throw new TestRuntimeException ('Button is not inside a link or a form ' );
0 commit comments