Selenium WebDriver can't find element by #FindBy annotation - java

I want to find this element
driver.findElement(By.className("name")).findElement(By.tagName("a"));
is there way to use #FindBy annotation?

This is possible. Selenium supports both #FindBys and #FindAll which adds finer tuning for page objects.
For chained element look-up, (which is what you're doing, a look-up inside a look-up), you'll want #FindBys.
#FindBys({#FindBy(className = "name"), #FindBy(tagName= "a")})
private WebElement element;
Further reading on FindBys and FindAll.

Since you are looking for an "a" tag inside an element with the "name" class, try combining them via XPath or CSS selectors:
#FindBy(xpath = "//*[#class = 'name']/a")
private WebElement nameLink;
or
#FindBy(css = ".name > a")
private WebElement nameLink;

I several test FindBys annotation in selenium but sometime when use
TageName and Name it's not correctly work!!.
ofter Find List<WebElement> use driver.findElement(By.name("....")) to do filter.

Related

Java Selenium FindBy cannot find div by unique class name

I am using Selenium with Java and I have encountered issue that I am unable to find div by class name, even though it is unique:
<div class="123123-randomclassname"></div>
I am able to find any other element, e.g. input, button, etc. I have issues with div tag only.
I have tried getting this web element using either #FindBy() annotation and findElement() method:
driver.findElement(By.className("123123-randomclassname"))
driver.findElement(By.cssSelector("div[class='123123-randomclassname'"))
#FindBy(className = "123123-randomclassname")
#FindBy(css = "div[class='123123-randomclassname'")
Any of these solutions did not work and I couldn't find element.
Try with following css selector
driver.findElement(By.cssSelector("div[class^='123123-']"))
//# and ]closing bracket was missing in syntax
WebElement DivTag = driver.findElement(By.xpath("div[#class='123123-randomclassname']"));
//OR
#FindBy(xpath = "div[#class='123123-randomclassname']") WebElement DivTag2;

How to find nested elements by class in Selenium

I have a div inside a div inside another div. Most outer div class is "Big Div", inside it there is a div with class "Medium Div" and the most inner div class is "Small Div".
I'm able to see the div's classes when I press the F12 key and hover over the elements, however I can't find them using Selenium.
What am I doing wrong?
WebElement big = browser.findElement(By.cssSelector("//div[contains(#class,'Big')]"));
WebElement medium = big.findElement(By.cssSelector("//div[contains(#class,'Medium')"));
WebElement small = medium.findElement(By.cssSelector("//div[contains(#class,'Small'"));
Note: my classes contain white spaces, Selenium can't find any of the divs and I get the exception: "No Such element".
The syntax you have used that is not for cssSelector that for XPATH and you have missed parenthesis as well.
Try following xpath now.
WebElement big = browser.findElement(By.xpath("//div[contains(#class,'Big')]"));
WebElement medium = big.findElement(By.xpath(".//div[contains(#class,'Medium')]"));
WebElement small = medium.findElement(By.xpath(".//div[contains(#class,'Small')]"));
However you can do it in once like.
WebElement small = browser.findElement(By.xpath("//div[contains(#class,'Big')]//div[contains(#class,'Medium')]//div[contains(#class,'Small')]"));
I would like to add a few lines to the answer of #KunduK
WebElement small = browser.findElement(new ByChained(By.xpath("//div[contains(#class,'Big')]"),By.xpath("//div[contains(#class,'Medium')]"),By.xpath("//div[contains(#class,'Small')]")));
When selenium already gives a few extra implementations, then why not to use it. :-)
You can get more details from the below link:
How Selenium's ByChained class really works?
https://www.linkedin.com/pulse/selenium-classes-stabilize-ui-automation-code-durga-behera/
Brackets are missing in the locator:
WebElement big = browser.findElement(By.cssSelector("div[class*='Big']"));
WebElement medium = big.findElement(By.cssSelector("div[class*='Medium']"));
WebElement small = medium.findElement(By.cssSelector("div[class*='Small')]"));
There is syntactical errors in placing parenthesis and the locator type used.
Try below code,
WebElement big = browser.findElement(By.xpath("//div[contains(#class,'Big')]"));
WebElement medium = big.findElement(By.xpath("//div[contains(#class,'Medium')]"));
WebElement small = medium.findElement(By.xpath("//div[contains(#class,'Small')]"));

WebDriver PageFactory Find Elements List

I have multiple elements on a page and I would like to initialize them using PageFactory.
I have tried using following
#FindBy(xpath = "//*[contains(#class,'x-grid-tree-node-leaf')]")
List<WebElement> allElements;
but this returns only one element.
now, if I use the traditional way for finding elements
List<WebElement> allElements = driver.findElements(By.xpath("//*[contains(#class,'x-grid-tree-node-leaf')]"));
this returns 4 elements
any pointers what could be the issue?
#FindBy(xpath = "//*[contains(#class,'x-grid-tree-node-leaf')]")
List<WebElement> allElements;
this works. there was bug in my code.
Use FindAll annotation to get series of #FindBy tags and search for all elements that match any of the FindBy criteria.
#FindAll(#FindBy(how = How.XPATH, using = "//*[contains(#class,'x-grid-tree-node-leaf')]"))
List<WebElement> allElements;
Instead of using #FindBy annotation, use #FindAllBy annotation.Try this!
#FindAllBy(xpath = "//*[contains(#class,'x-grid-tree-node-leaf')]")
List<WebElement> allElements;
Here's the link for FindAllBy java class.
Have you tried running your xpath in Chrome Developer tool or in Firebug?
List<WebElement> allElements = driver.findElements(By.xpath("//*[contains(#class,'x-grid-tree-node-leaf')]"));
should work.

Locating button with xpath - JAVA / Selenium 2 in Chrome

Code behind button:
<input class=”btn” id=”mypage:formid:relatedScenaiosListId:j_id27:j_id28″ name=”mypage:formid:relatedScenaiosListId:j_id27:j_id28″ onclick=”window.open(‘/apex/newscenario?Opportunity__c=006f00000072n8hAAA’,’_top’, 1);;A4J.AJAX.Submit(‘mypage:formid’,event,{‘similarityGroupingId’:’mypage:formid:relatedScenaiosListId:j_id27:j_id28′,’parameters’:{‘mypage:formid:relatedScenaiosListId:j_id27:j_id28′:’mypage:formid:relatedScenaiosListId:j_id27:j_id28′} } );return false;” value=”New” type=”button”>
I did a right click from the Inspect Element view and saw I could copy the Xpath and found it was :
//*[#id="mypage:formid:relatedScenaiosListId:j_id27:j_id28"]
Note the *.
I tired:
WebElement txtnew = driver.findElement(By.xpath(“//input[#id='mypage:formid:relatedScenaiosListId:j_id27:j_id28']“));
txtnew.click();
and
WebElement txtnew = driver.findElement(By.xpath(“//input[#id='mypage:formid:relatedScenaiosListId:j_id27:j_id28'][#value='New']“));
txtnew.click();
but neither worked.
I’m curious about the *, if that should be part of my Xpath statement?
If it's not necessary for you to use xpath, use searching by id, or cssSelectors to find your element. E.g.
//if you have only one element with class btn you can use this selector
//if element placed in parent (and this can identify element much more) add selector to
//parent before .btn
WebElement txtnew = driver.findElement(By.Css(".btn"));
//or
WebElement txtnew = driver.findElement(By.Css("input[value='New']"));
//or if id not generated automatically
WebElement txtnew = driver.findElement(By.Css("#mypage:formid:relatedScenaiosListId:j_id27:j_id28"));
//or using By.Id
WebElement txtnew = driver.findElement(By.Id("mypage:formid:relatedScenaiosListId:j_id27:j_id28"));
Any of them will work in specific situation. Choose one which more suitable for your sitution. Thanks.
Try this xpath:
input[#value='New'][#class='btn'][starts-with(#id, 'mypage:formid')]
The real issue, that I didn't realize, was that the control was in a different frame. Once I set the driver to look at the frame any number of xpath expressions worked.
` driver.manage().timeouts().implicitlyWait(25, TimeUnit.SECONDS);
driver.switchTo().frame("066i0000004bNpx");
WebElement txtNewbtn = driver.findElement(By.id("mypage:formid:relatedScenaiosListId:j_id27:j_id28"));
txtNewbtn.click();`

webdriver classname with space using java

This question received great answers in jquery and I was wondering if someone could give an example of this in Java please?
I'm doing driver.findElement(By.className("current time")).click(); The space is the issue, and I see the explanation at the link, but I'm not sure how to handle it in java, and don't have access to change the class name.
Pasting example of what i get in the firefox inspect id: Example with cssSelector below did not work, but i may be missing something.
<span>
<a class="current time" href="http://someurl/" onclick="s_objectID="http://someur/">url</a>
</span>
Instead of class name you can use a css selector. You don't mention the tagname for the class 'current time'. I am assuming it to be input, so your css selector work be,
WebElement element = driver.findElement(By.cssSelector("input[class='current time']"));
element.click();
Edit#1 Based on html provided,
Looking at the html in your comment, it seems you have quite a few options to find the webElement. Here are your options,
WebElement element = driver.findElement(By.cssSelector("a[class='current time']"));
element.click();
or this should work too,
WebElement element = driver.findElement(By.cssSelector("a.current.time"));
element.click();
You can also use linkText since the element is link. From the html you provided, the link text is 'url'
WebElement element = driver.findElement(By.linkText("url"));
element.click();
You can also use By.partialLinkText("partial link text here");
You can also use xpath as:
WebElement element = driver.findElement(By.xpath("//a[#class='current time']"));
element.click();
OR,
WebElement element = driver.findElement(By.xpath("//a[text() = 'url']"));
element.click();
For a less fragile test, another option is to use an XPATH which doesn't depend of the order of classes, like:
WebElement element = driver.findElement(By.xpath("//a[contains(#class, 'current') and contains(#class, 'time')]"));
Whenever you found some space in the class name you need to switch to cssSelector Locator.
Convert a class name to cssSelector if it is having a space as below.
In your case it would be:
WebElement element = driver.findElement(By.cssSelector(".current.time"));
element.click();
PS: add . [dot] in start of class name and replace the space with . [dot] to convert class name to cssSelector.

Categories

Resources