Buy

Finding inside HTML Tables

To finish the scenario, we need a Then that's able to look for a check mark on a specific row. The check mark icon itself is an element with a fa fa-check class.

There is no built in definition to find elements inside of a specific row. So let's describe this using natural language. How about:

43 lines features/web/product_admin.feature
... lines 1 - 27
Then the "Foo1" row should have a check mark
... lines 29 - 43

Execute Behat to get that definition printed out for us:

./vendor/bin/behat features/product_admin.feature:21

When you're feeling really lazy, you can add a --append-snippets flag and Behat will put the definitions inside of the FeatureContext class for you:

./vendor/bin/behat features/product_admin.feature:21 --append-snippets

Change arg1 to be rowText:

231 lines features/bootstrap/FeatureContext.php
... lines 1 - 118
/**
* @Then the :rowText row should have a check mark
*/
public function theProductRowShouldShowAsPublished($rowText)
{
... lines 124 - 127
}
... lines 129 - 231

Ok, this is a bit harder. First, we need to find a row that contains that $rowText and then look inside of just that element to see if it has a fa-check class in it.

Start by finding via CSS, $row = $this->getPage()->find('css'). For the selector, use table tr: and then the contains pseudo selector that looks for some text inside. Pass %s and set the value using sprintf():

231 lines features/bootstrap/FeatureContext.php
... lines 1 - 123
$row = $this->getPage()->find('css', sprintf('table tr:contains("%s")', $rowText));
... lines 125 - 231

$row will now be the first tr containing this text, or null. It's not perfect: if $rowText had some bad characters in it, the selector would fail. But this is my test so I'll be lazy until I can't. Add assertNotNull() function:

231 lines features/bootstrap/FeatureContext.php
... lines 1 - 124
assertNotNull($row, 'Cannot find a table row with this text!');
... lines 126 - 231

Finally, assert that the row's HTML has a fa-check class inside of it with assertContains():

231 lines features/bootstrap/FeatureContext.php
... lines 1 - 126
assertContains('fa-check', $row->getHtml(), 'Could not find the fa-check element in the row!');
... lines 128 - 231

Moment of truth:

./vendor/bin/behat features/product_admin.feature:21

We're green! Now, let's get even harder.

Leave a comment!