following-sibling::text() only if contains needle - xpath

In PHP-Xpath i get text between <br /> tags like:
//*/br/following-sibling::text()
How can i get this text only if contains 'needle'?
Something like br[contains(.,'needle')] - or - following-sibling::*contains(.,'needle')/text()
Appreciate any help

Use:
following-sibling::text()[contains(., 'needle')]

Related

Xpath - selecting nearest element after plain text

Let's say we have the following structure :
some text
<img src="#" />
sdfsdf
sdfsdf
plaintext-identificator-123
<img src="1" /> //get
<img src="2" /> //get
<img src="3" /> //not get
I need to get the nearest 2 elements after "plaintext-identificator-123".
In this case, the desired result would be to get 2 elements with srcs 1 and 2.
This is one of the ways:
//text()[contains(., 'plaintext-identificator-123')]/following-sibling::img[position()<3]
Try this on your actual structure and see if it works (it works for your sample in the question):
(//img['plaintext-identificator-123']/following-sibling::img)[position()<3]
if you want the attribute values of the src attribute of the target img nodes, change it to:
(//img['plaintext-identificator-123']/following-sibling::img)[position()<3]/#src
Edit:
Following the comments below, try this:
(//text()[contains(.,'plaintext-identificator-123')]/preceding-sibling::img/following-sibling::img)[position()<3]/#src
Use http://xpather.com/DOJz7nl1 (try it with and without the indentificator).

Xpath get element above

suppose I have this structure:
<div class="a" attribute="foo">
<div class="b">
<span>Text Example</span>
</div>
</div>
In xpath, I would like to retrieve the value of the attribute "attribute" given I have the text inside: Text Example
If I use this xpath:
.//*[#class='a']//*[text()='Text Example']
It returns the element span, but I need the div.a, because I need to get the value of the attribute through Selenium WebDriver
Hey there are lot of ways by which you can figure it out.
So lets say Text Example is given, you can identify it using this text:-
//span[text()='Text Example']/../.. --> If you know its 2 level up
OR
//span[text()='Text Example']/ancestor::div[#class='a'] --> If you don't know how many level up this `div` is
Above 2 xpaths can be used if you only want to identify the element using Text Example, if you don't want to iterate through this text. There are simple ways to identify it directly:-
//div[#class='a']
From your question itself you have mentioned the answer for it
but I need the div.a,
try this
driver.findElement(By.cssSelector("div.a")).getAttribute("attribute");
use cssSelector for best result.
or else try the following xpath
//div[contains(#class, 'a')]
If you want attribute of div.a with it's descendant span which contains text something, try as below :-
driver.findElement(By.xpath("//div[#class = 'a' and descendant::span[text() = 'Text Example']]")).getAttribute("attribute");
Hope it helps..:)

xpath: how to get the specific text using xpath?

the html is like this:
<div id='id'>
<a href>abc</a>
"xyz"
</div>
I want to use xpath to get the xyz (I use it in capybara), but my xpath can't work
... //div[#id='id'].text
it returns abcxyz
how can I get it?
Text is its own text node, so the correct selector would be:
.//div[#id='id']/text()

XPATH required for an input text field?

i have a text box in my web application,Where i need to give input. I am trying to find the xpath of the text box. the following error is thrown.
Unable to locate element: {"method":"xpath","selector":"
HTML code:
<div class="input">
<input id="firstName" class="long" type="text" maxlength="50" value="" name="firstName
I want the xpath for firstName textbox.
//input[#type='text']
And this for generally targeting a text input (what I was after)
Try this one:
//input[#id='firstName']
Explanation:
// search on all levels
input for element nodes with the name of "input"
[#id='firstName'] having an attribute (#) with the name of "id" and a value of "firstName"
at least 3 simple ways to get this:
1)Driver.FindElement(By.XPath("//input[#id='firstName']"));
2)Driver.FindElement(By.Id("firstName"));
3)Driver.FindElement(By.CssSelector("#firstName"));
//*[text()[contains(.,'firstName')]]
finding by text would always work.

can you spot the error in this xpath

I'm a little new to xpath and I was wondering if you anyone can help me understand what's wrong with the following xpath query. The server is telling me I have an "invalid predicate"
Here's the xpath:
xpath("div[span[#class='paragraphnumber]/text()='$next_pn']/#id")
I want this to find the #id of the div which contains within it a span element with the #class of "paragraphnumber" and the text which equals the number contained in the variable $next_pn. The div would look something like this:
<div id="pl8ddjkdj"><span class="paragraphnumber">3</span>lor ipsum etc etc</div>
Basically, I'm starting with the number I want to be able to find the unique id of this div.
Thanks for your help.
You have just missed a single quote (') after the name of the class paragraphnumber.
This:
xpath("div[span[#class='paragraphnumber]/text()='$next_pn']/#id")
should be
// v
xpath("div[span[#class='paragraphnumber']/text()='$next_pn']/#id")

Resources