Search code examples
selenium-webdriverselenium-java

Concatenation in xpath


The element that I want to find with Selenium contains a text with both quotes and double quotes.

The text is:

"It's a traditional Valentines Day present and no one should spare money for it"

enter image description here

My auxilliary method:

private String preparePhraseForXpath(String phrase){
        return "concat('\"', 'It', '\'', 's a traditional Valentines Day present and no one should spare money for it', '\"')";
}

It is just a temporary stub method with a hardcoded phrase.

        String phraseForXpath = preparePhraseForXpath(phraseStr);
        try {
            WebElement tmpPhraseElement = seleniumService.findElement(driver,
                    0,
                    "//*[text() = '" + phraseForXpath + "']");

        ....

The element on the page:

<div id="react-aria6703854087-60" class="dc-TextArea__textarea dc-TextInput__textarea dc-TextInput__textarea_textAlign_left dc-TextInput__textarea_break_word dc-TextInput__textarea_with-highlight dc-Scrollbar dc-typography dc-typography_size_16-24 dc-typography_role_main dc-typography_color_gray" role="textbox" inputmode="text" aria-multiline="true" placeholder="Введите фразу или список фраз" data-testid="KeywordsMultipleInputs.Input0" aria-required="false" aria-invalid="false" aria-autocomplete="none" autocomplete="off" spellcheck="false" style="height: auto;" contenteditable="true">"It's a traditional Valentines Day present and no one should spare money for it"</div>

enter image description here

The problem: WebElementNotFoundException.

Could you tell me how to rewrite the hardcoded preparePhraseForXpath for the element to be found?


Solution

  • Instead of a perfect match with text() as an alternative you can use partial match using contains() as follows:

    In auxilliary method:

    private String preparePhraseForXpath(String phrase){
        return "s a traditional Valentines Day present and no one should spare money for it";
    }
    

    Within the stub:

    String phraseForXpath = preparePhraseForXpath(phraseStr);
    try {
         WebElement tmpPhraseElement = seleniumService.findElement(driver, 0,"//*[contains(., '" + phraseForXpath + "')]");
         ....