Codeception / Codeception/lib-xml

Passing xpath to XmlStructure::matchElement() always throws Exception

Aberta
#6 1 comentário 0 reações 0 responsáveis Ver no GitHub
Linguagem predominante
PHP
Estrelas
17
Forks
1
Métricas de merge de PRs
Nenhum PR com merge em 30d

Descrição

The signature allows param `$cssOrXpath`: https://github.com/Codeception/lib-xml/blob/main/src/Util/XmlStructure.php#L37
But when an xpath is passed, it will throw an exception.

This is broken since Codeception 5.0:
- v4 used to catch parser exceptions, and then continues to try an xpath: https://github.com/Codeception/Codeception/blob/4.2.2/src/Codeception/Util/XmlStructure.php#L39-L46
- v5 does not: https://github.com/Codeception/lib-xml/blob/main/src/Util/XmlStructure.php#L40

## Reproduce

- Create a unit test and pass an xpath, for example through Codeceptions SOAP module `grabTextContentFrom()` (https://codeception.com/docs/modules/SOAP#grabTextContentFrom):
```
$xpath = '/example';
$I->grabTextContentFrom($xpath))
```
- Run the test. Output:
```
1) ExampleCest: Call undefined operation
Test ExampleCest.php:example

[Symfony\Component\CssSelector\Exception\SyntaxErrorException] Expected selector, but found.

Scenario Steps:

4. $I->grabTextContentFrom("/example") at (..)

#1 (..)\vendor\symfony\css-selector\Exception\SyntaxErrorException.php:28
#2 (..)\vendor\symfony\css-selector\Parser\Parser.php:284
#3 (..)\vendor\symfony\css-selector\Parser\Parser.php:115
#4 (..)\vendor\symfony\css-selector\Parser\Parser.php:100
#5 (..)\vendor\symfony\css-selector\Parser\Parser.php:42
#6 (..)\vendor\symfony\css-selector\XPath\Translator.php:222
#7 (..)\vendor\symfony\css-selector\XPath\Translator.php:92
#8 (..)\vendor\symfony\css-selector\CssSelectorConverter.php:65
#9 Codeception\Module\SOAP->grabTextContentFrom
```

## Possible fix

Re-implement the try-catch:
```php
public function matchElement(string $cssOrXPath): ?DOMNode
{
$domXpath = new DOMXpath($this->xml);
try {
$selector = (new CssSelectorConverter())->toXPath($cssOrXPath);
$els = $domXpath->query($selector);
if ($els !== false && count($els) > 0) {
return $els->item(0);
}
} catch (\Symfony\Component\CssSelector\Exception\ParseException $e) {
}
$els = $domXpath->query($cssOrXPath);
if ($els !== false && count($els) > 0) {
return $els->item(0);
}
throw new ElementNotFound($cssOrXPath);
}
```

Guia de contribuição

Nenhum guia de contribuição indexado para este repositório

Avaliação

Esta issue ainda não foi avaliada.

Receba novas issues na sua caixa de entrada

Um resumo curto de issues do GitHub para quem está começando.