diff --git a/src/Context/BasicContext.php b/src/Context/BasicContext.php index 2ed1dd6c..abacd571 100644 --- a/src/Context/BasicContext.php +++ b/src/Context/BasicContext.php @@ -545,6 +545,17 @@ public function iClickInTheElementDismissingTheDialog($clickType, $text, $select $this->iDismissTheDialog(); } + /** + * @Then /^the "([^"]+)" element "([^"]+)" attribute should be "([^"]*)"$/ + */ + public function theElementAttributeShouldBe($selector, $attribute, $value) + { + $page = $this->getSession()->getPage(); + $element = $page->find('css', $selector); + Assert::assertNotNull($element, sprintf('Element %s not found', $selector)); + Assert::assertEquals($value, $element->getAttribute($attribute)); + } + /** * @Given /^I see the text "([^"]+)" in the alert$/ * @param string $expected diff --git a/src/Context/FixtureContext.php b/src/Context/FixtureContext.php index c5dba7c4..34724aee 100644 --- a/src/Context/FixtureContext.php +++ b/src/Context/FixtureContext.php @@ -30,6 +30,7 @@ use SilverStripe\Security\Member; use SilverStripe\Security\Permission; use SilverStripe\Versioned\Versioned; +use SilverStripe\Core\Config\Config; /** * Context used to create fixtures in the SilverStripe ORM. @@ -659,7 +660,16 @@ class_exists($extension ?? '') && is_subclass_of($extension, Extension::class), // Add the extension to the CLI context /** @var Extensible $targetClass */ - $targetClass = $this->convertTypeToClass($class); + try { + $targetClass = $this->convertTypeToClass($class); + } catch (InvalidArgumentException $e) { + // will end up here if the class is not a subclass of DataObject + if (class_exists($class)) { + $targetClass = $class; + } else { + throw $e; + } + } $targetClass::add_extension($extension); // Write config for this extension too... @@ -885,6 +895,70 @@ protected function getAssetStore() return Injector::inst()->get(AssetStore::class); } + /** + * Selects the first match of $select in the given HTML editor (tinymce) + */ + protected function selectInTheHtmlField(string $select, string $field) + { + $inputField = $this->getHtmlField($field); + $inputField->getParent()->find('css', 'iframe')->click(); + $inputFieldId = $inputField->getAttribute('id'); + $js = <<getMainContext()->getSession()->executeScript($js); + } + + /** + * Selects the first image match in the HTML editor (tinymce) + * + * @When /^I select the image "([^"]+)" in the "([^"]+)" HTML field$/ + * @param string $filename + * @param string $field + */ + public function iSelectTheImageInHtmlField($filename, $field) + { + $this->selectInTheHtmlField("img[src*='$filename']", $field); + } + + /** + * Locate an HTML editor field + * + * @param string $locator Raw html field identifier as passed from + * @return NodeElement + */ + protected function getHtmlField($locator) + { + $locator = str_replace('\\"', '"', $locator ?? ''); + $page = $this->getMainContext()->getSession()->getPage(); + $element = $page->find('css', 'textarea.htmleditor[name=\'' . $locator . '\']'); + if ($element) { + return $element; + } + $label = $page->findAll('xpath', sprintf('//label[contains(text(), \'%s\')]', $locator)); + if (!empty($label)) { + Assert::assertCount(1, $label, "Found more than one element containing the phrase \"$locator\""); + $label = array_shift($label); + $fieldId = $label->getAttribute('for'); + $element = $page->find('css', '#' . $fieldId); + } + Assert::assertNotNull($element, sprintf('HTML field "%s" not found', $locator)); + return $element; + } + /** * Converts a natural language class description to an actual class name. * Respects {@link DataObject::$singular_name} variations.