0

I am trying to use this xpath to find the number of elements that have a value between X and Y. The problem I am facing is since there is &nbsp in the HTML, and the code doesn't detect the text value.

Xpath:

    //div[@class="prix"]/div[2]/div[2]/span[1][number(translate(text(), ",", ".")) > 4 and number(translate(text(), ",", ".")) < 43]

HTML :

    <div class="d-flex-inline productPrice">
      <span>4,42&nbsp;</span>
      <span>€/HT</span>
    </div>

I tried with replace(text()," ","") and replace(text(),"\&nbsp;\","") and other combinations but nothing worked.

1
  • I thought number stripped whitespace?
    – ernie
    Feb 4, 2022 at 0:40

4 Answers 4

0

It's easier to use xpath simply to locate the element and treat fetched string using your programming language.

For example, in Java, you can use a regex to replace anything that is not a number or dot with an empty character, thus keeping only the number representation.

String onlyNumbers = str.replaceAll("^\d+(\.\d+)*$", "");
1
  • yeah normaly but for less code i try to get the size of that xpath so if the size is equal to what i have i want need to creat a "for" function to test every article that shows
    – Yan
    Feb 3, 2022 at 14:33
0

If your HTML Code is this,

<body>
    <div class="d-flex-inline productPrice">
        <span>4,42&nbsp;</span>
        <span>€/HT</span>
    </div>
</body>
</html>

Then you can get only the number and ignore the space or any other character from the text you get from getText() using this,

driver.findElement(By.xpath("//div[@class='d-flex-inline productPrice']/span[1]")).getText().replaceAll("[^\\p{ASCII}]|&nbsp;| ", "");

Here is my working code,

try {
            WebDriver driver;
            System.setProperty("webdriver.chrome.driver", System.getProperty("user.dir") + "//chromedriver");
            driver = new ChromeDriver();
            driver.manage().timeouts().implicitlyWait(20, TimeUnit.SECONDS);
            driver.get("file:///home/eclipse-workspace/demo/test.html");
            Thread.sleep(2000);
            System.out.println(driver.findElement(By.xpath("//div[@class='d-flex-inline productPrice']/span[1]")).getText().replaceAll("[^\\p{ASCII}]|&nbsp;| ", ""));
            
            Thread.sleep(5000);
            driver.close();
            driver.quit();
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
0

This a common scenario faced by testing companies who provide automation testing services.

To remove spaces from the text we can have a regular expression check and replace HTML  

String myStr = "4,42&nbsp";
myStr = myStr.replaceAll("[\\s\\u00A0]+$", "") ;

It removes non breaking spaces in the input string.

0

You can remove the nbsp using normalize-space(). Based on the html snippet your provided , I can find detect the text value:

//div[@class="d-flex-inline productPrice"]/span[normalize-space()="4,42\u00a0"]

It has already been answered here - https://stackoverflow.com/questions/55355770/how-can-i-find-the-exact-value-using-xpath-in-selenium-webdriver-for-text-that-c/55359370#comment97447308_55359370

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge that you have read and understand our privacy policy and code of conduct.

Not the answer you're looking for? Browse other questions tagged or ask your own question.