@@ -439,29 +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
- 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 = [];
455
468
}
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
+ }
465
483
}
466
484
}
467
485
throw new TestRuntimeException ('Button is not inside a link or a form ' );
0 commit comments