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;
Related
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')]"));
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.
Edit :
The element was inside an iframe, this is how it finally worked:
WebDriverWait wait = new WebDriverWait(_driver, 60);
wait.until(ExpectedConditions.frameToBeAvailableAndSwitchToIt(By
.xpath("//*[#class='IFrameID']")));
WebElement element_t = _driver.findElement(
By.xpath("//*[#myattribute='mytest']"));
Edit :
My problem seems to be the structure of the page. i tried different things, and i only was able to get the body by id, ever other element i tried to get by id or any other attribute couldnt be found...
I am trying to get an element by using the By.xpath method, the xpath itself works just fine when used in firebug/firepath, but when used in the java application i am getting an Exception:
org.openqa.selenium.NoSuchElementException: Unable to locate element: {"method":"xpath","selector":".//*[#myattribute='mytest']"}
The attribute i am trying to access is not a standard html one, but generated from a framework so the field looks like this :
<input id="F_19" class="FIELDInputEdit" type="text" style=" width:100%;" maxlength="40" myattribute="mytest" name="CC">
The javacode itself looks like this :
WebElement element_t = _driver.findElement(
By.xpath(".//*[#myattribute='mytest']"));
Since the only known attribute is this one, i have no ohter way to access the input field.
I am using Firefox 17.0.11
good practice (imho) before using xpath in webdriver test it using selenium ide (http://docs.seleniumhq.org/download/)
Error might be because of «.» before «//». Try to remove it.
Read this: http://www.w3schools.com/xpath/xpath_syntax.asp
.//*[#myattribute='mytest']
«.» = Selects the current node
«//» = Selects nodes in the document from the current node that match the selection no matter where they are
«*» = Matches any element node
«[#myattribute='mytest']» ( = [#myattribute = \"mytest\"]) = Node, that contains attribute "myattribute", which value is "mytest"
Now, _driver.findElement(By.xpath("//*[#myattribute='mytest']")) = search whole page for first node with attribute «myattribute» with value «mytest»
_driver.findElement(By.xpath("//input[#myattribute='mytest']"))
= search whole page for first input with «myattribute» = «mytest»
_driver.findElement(By.xpath("//input[#myattribute='mytest']")).then(By.path("./*[#comeAtr]")) = in input with «myattribute» = «mytest» find any node with atribute = «
Have you tried to use CSS selectors instead?
By.cssSelector("input[myattribute=\"mytest\"]")
The element was inside an iframe, this is how it finally worked:
WebDriverWait wait = new WebDriverWait(_driver, 60);
wait.until(ExpectedConditions.frameToBeAvailableAndSwitchToIt(By
.xpath("//*[#class='IFrameID']")));
WebElement element_t = _driver.findElement(
By.xpath("//*[#myattribute='mytest']"));
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();`
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.