Codeception / Codeception/module-webdriver

Make WebDriver::getLocator (and WebDriver::getStrictLocator) public

Ouverte
#50 0 commentaires 0 réactions 0 personnes assignées Voir sur GitHub
Langage dominant
PHP
Étoiles
39
Forks
25
Métriques de merge des PR
Aucune PR mergée en 30 j

Description

#### What are you trying to achieve?
Write a custom action that uses the WebDriver locator service to locate an element by its selector string.
I would like to do this by getting the web driver module with `$this->getModule('WebDriver')` rather than extending `WebDriver` to keep my testing architecture consistent with other modules I've written.

#### What do you get instead?
Unable to use the functions because they're protected.

```php
/**
* @param $selector
* @return WebDriverBy
* @throws \InvalidArgumentException
*/
protected function getLocator($selector)
{
if ($selector instanceof WebDriverBy) {
return $selector;
}
if (is_array($selector)) {
return $this->getStrictLocator($selector);
}
if (Locator::isID($selector)) {
return WebDriverBy::id(substr($selector, 1));
}
if (Locator::isCSS($selector)) {
return WebDriverBy::cssSelector($selector);
}
if (Locator::isXPath($selector)) {
return WebDriverBy::xpath($selector);
}
throw new \InvalidArgumentException("Only CSS or XPath allowed");
}

// ...and

/**
* @param array $by
* @return WebDriverBy
*/
protected function getStrictLocator(array $by)
{
$type = key($by);
$locator = $by[$type];
switch ($type) {
case 'id':
return WebDriverBy::id($locator);
case 'name':
return WebDriverBy::name($locator);
case 'css':
return WebDriverBy::cssSelector($locator);
case 'xpath':
return WebDriverBy::xpath($locator);
case 'link':
return WebDriverBy::linkText($locator);
case 'class':
return WebDriverBy::className($locator);
default:
throw new MalformedLocatorException(
"$by => $locator",
"Strict locator can be either xpath, css, id, link, class, name: "
);
}
}
```
### Details
It seems to me that these are services that the `WebDriver` module should expose, as some public `WebDriver` functions take `WebDriverBy` arguments (e.g. `WebDriver::findElements`). We need some service to get these `WebDriverBy` arguments, or we won't be able to use the public function calls that are exposed through `$this->getModule('WebDriver');`. Alternatively, maybe the `WebDriver` module should expose some public `findElement` type of function that takes a selector string rather than a `WebDriverBy` instance.

* Codeception version: 2.2.10
* PHP Version: 7.0.10

Apologies if this has already been discussed, I didn't see it on the issues board. And thanks for making such a fantastic tool!

Guide de contribution

Aucun guide de contribution indexé pour ce dépôt

Piste de recherche

Commencez par les points d’entrée WebDriver::getLocator et WebDriver::getStrictLocator et examinez comment les fonctions publiques telles que WebDriver::findElements reçoivent les arguments WebDriverBy. Vérifiez que le module obtenu via $this->getModule('WebDriver') peut utiliser les deux services de localisation depuis une action personnalisée, et confirmez que la gestion des sélecteurs invalides reste couverte par le comportement existant montré dans l’issue.

Rédigé par le modèle d'indexation à partir du texte de l'issue.

Évaluation

Stack technique
php
Domaine
testing-qa
Type d'issue
Fonctionnalité
Difficulté
2/5
Temps estimé
1-3 heures
Activité
À l'abandon
Clarté
Clairement spécifiée
Accessibilité débutants
45/100

Recevez les nouvelles issues par e-mail

Un résumé court des issues GitHub adaptées aux débutants.