I am using Selenium with Java an facing the following problem.
When I use the following code:
driver.findElement(By.xpath(firstNameXPath)).sendKeys(firstName);
I am able to successfully select the appropriate locator on the page and get no errors.
However, when I pass the locator to a method to check if the locator exists first and only then send keys I always get an error (locator not being present).
This is the method I am using:
public boolean IsXPathPresent(String XPath)
{
try
{
driver.findElement(By.xpath(XPath));
System.out.println("Selector: " + XPath + " found");
return true;
} catch (Exception e)
{
System.out.println(XPath + " Selector Not Present");
return false;
}
}
I am passing firstNameXPath to the method IsXPathPresent.
For some reason my program always outputs "Selector Not Present" which means it is always executing the catch part. But why ? The selector is present on page..
Is there something wrong with my try/catch block?
Thanks
I have a problem with Selenium Webdriver. Following code is where my headache is at:
boolean FindPrimary=driver.findElement(By.xpath("//*[#id='started_in_business_view']/p")) != null;
if(FindPrimary){
driver.findElement(By.xpath("//*[#id='started_in_business_view']/p")).click();
}
else
driver.findElement(By.xpath("//*[#id='started_in_business_view']/div")).click();
The excepted result that I want to achieve is that the driver searches for the element and clicks it. And if it doesn´t find it ,the driver clicks the optional element.
I assume you received a NoSuchElement in the first line.
boolean findPrimary=driver.findElements(By.xpath("//*[#id='started_in_business_view']/p")).size() > 0;
if(findPrimary){
driver.findElement(By.xpath("//*[#id='started_in_business_view']/p")).click();
}
else
driver.findElement(By.xpath("//*[#id='started_in_business_view']/div")).click();
I would do it with
try{
driver.findElement(By.xpath("//*[#id='started_in_business_view']/p")).click();
} catch (Exception exc) {
driver.findElement(By.xpath("//*[#id='started_in_business_view']/div")).click();
}
if you're xpaths are correct, should work...
i want to put if else or switch statement which is more suitable for checking employee count before commit.where i put my if else or switch code . i want restriction on employee if count is 5 then its show message "reached maximum employee limites" otherwise allow commit.
i am new in java plz someone help me to solve this
public String cmdSave_action()
{
// my code before
{
DeptSet result;
try {
dbo.connect();
result =
dbo.execSQL("select count(*) from empmasterinfo where mainid='ORGElement' and designationid='?') "
(inputText_ORGElement.getValue() != null ?
""));
result = dbo.execSQL(sSQL);
catch (Exception e) {
System.out.println(e.getMessage());
finally
{
dbo.close();
}
return null;
}}}
// my code above
{
Global.PerformIteratorAction(this.bindings, "Commit");
AdfFacesContext afContext = AdfFacesContext.getCurrentInstance();
afContext.getProcessScope().put("EmployeeID",
Global.getCurrRowFieldValue("EmpmasterinfoViewIterator",
"Employeeid"));
if (afContext.getProcessScope().get("AddEdit").toString().equals("0"))
{
Global.PerformIteratorAction(this.bindings,
"EPR_TRANSFER_APPLICANT_INFO");
Global.PerformIteratorAction(this.bindings, "eprGenerateApPlan");
}
return null;
}}
My Error Log
Error(149,12): 'try' without 'catch' or 'finally'
Error(154,36): , expected
Error(157,34): field SQL not found in class hcm.view.backing.empprofile.EmployeeMasterInfo_Add
Error(159,11): illegal start of expression
Error(159,11): ; expected
E:\HCM\ViewController\src\hcm\view\backing\empprofile\dbo.java
Error(13,16): method does not return a value
Please close Your try catch block properly
try{
}catch(Exception e){
}finally{
}
And Read this
catch and finally are within try block
try {
//code
}
catch(Exception e) {
System.out.println(e.getMessage());
}
finally {
dbo.close();
}
Using an IDE will help you with indentation and proper formatting while writing code. e.g Eclipse.
For the first error close the try-catch blocks properly
And for the second error: Since your method is declared as public String cmdSave_action(), you should return a String value at the end of the method. The return statement is missing in your code.
In my script there's a dynamic pull down menu that appears depending on the choice made in the previous step. My code works when the menu is present, but when it's not my script fails. I'm using the strBusinessType variable to bring in data from my SQL database.
//Select Business Type (If Present)
owd.manage().timeouts().implicitlyWait(0, TimeUnit.MILLISECONDS);
boolean exists = owd.findElements( By.id("BusinessType1") ).size() !=0;
owd.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);
if (exists){
new Select(owd.findElement(By.id("BusinessType1"))).selectByVisibleText(strBusinessType);
}
else{
System.out.println("Business Type not present");
}
Try surrounding your code in a try block and catch the exception when the element is not present.
try {
owd.manage().timeouts().implicitlyWait(0, TimeUnit.MILLISECONDS);
boolean exists = owd.findElements( By.id("BusinessType1") ).size() !=0;
owd.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);
if (exists){
new Select(owd.findElement(By.id("BusinessType1"))).selectByVisibleText(strBusinessType);
}
}
catch (Exception e){
System.out.println("Business Type not present");
}
In tests that I write, if I want to assert a WebElement is present on the page, I can do a simple:
driver.findElement(By.linkText("Test Search"));
This will pass if it exists and it will bomb out if it does not exist. But now I want to assert that a link does not exist. I am unclear how to do this since the code above does not return a boolean.
EDIT This is how I came up with my own fix, I'm wondering if there's a better way out there still.
public static void assertLinkNotPresent (WebDriver driver, String text) throws Exception {
List<WebElement> bob = driver.findElements(By.linkText(text));
if (bob.isEmpty() == false) {
throw new Exception (text + " (Link is present)");
}
}
It's easier to do this:
driver.findElements(By.linkText("myLinkText")).size() < 1
I think that you can just catch org.openqa.selenium.NoSuchElementException that will be thrown by driver.findElement if there's no such element:
import org.openqa.selenium.NoSuchElementException;
....
public static void assertLinkNotPresent(WebDriver driver, String text) {
try {
driver.findElement(By.linkText(text));
fail("Link with text <" + text + "> is present");
} catch (NoSuchElementException ex) {
/* do nothing, link is not present, assert is passed */
}
}
Not Sure which version of selenium you are referring to, however some commands in selenium * can now do this:
http://release.seleniumhq.org/selenium-core/0.8.0/reference.html
assertNotSomethingSelected
assertTextNotPresent
Etc..
There is an Class called ExpectedConditions:
By loc = ...
Boolean notPresent = ExpectedConditions.not(ExpectedConditions.presenceOfElementLocated(loc)).apply(getDriver());
Assert.assertTrue(notPresent);
Try this -
private boolean verifyElementAbsent(String locator) throws Exception {
try {
driver.findElement(By.xpath(locator));
System.out.println("Element Present");
return false;
} catch (NoSuchElementException e) {
System.out.println("Element absent");
return true;
}
}
With Selenium Webdriver would be something like this:
assertTrue(!isElementPresent(By.linkText("Empresas en Misión")));
boolean titleTextfield = driver.findElement(By.id("widget_polarisCommunityInput_113_title")).isDisplayed();
assertFalse(titleTextfield, "Title text field present which is not expected");
It looks like findElements() only returns quickly if it finds at least one element. Otherwise it waits for the implicit wait timeout, before returning zero elements - just like findElement().
To keep the speed of the test good, this example temporarily shortens the implicit wait, while waiting for the element to disappear:
static final int TIMEOUT = 10;
public void checkGone(String id) {
FluentWait<WebDriver> wait = new WebDriverWait(driver, TIMEOUT)
.ignoring(StaleElementReferenceException.class);
driver.manage().timeouts().implicitlyWait(1, TimeUnit.SECONDS);
try {
wait.until(ExpectedConditions.numberOfElementsToBe(By.id(id), 0));
} finally {
resetTimeout();
}
}
void resetTimeout() {
driver.manage().timeouts().implicitlyWait(TIMEOUT, TimeUnit.SECONDS);
}
Still looking for a way to avoid the timeout completely though...
You can utlilize Arquillian Graphene framework for this. So example for your case could be
Graphene.element(By.linkText(text)).isPresent().apply(driver));
Is also provides you bunch of nice API's for working with Ajax, fluent waits, page objects, fragments and so on. It definitely eases a Selenium based test development a lot.
For node.js I've found the following to be effective way to wait for an element to no longer be present:
// variable to hold loop limit
var limit = 5;
// variable to hold the loop count
var tries = 0;
var retry = driver.findElements(By.xpath(selector));
while(retry.size > 0 && tries < limit){
driver.sleep(timeout / 10)
tries++;
retry = driver.findElements(By.xpath(selector))
}
Not an answer to the very question but perhaps an idea for the underlying task:
When your site logic should not show a certain element, you could insert an invisible "flag" element that you check for.
if condition
renderElement()
else
renderElementNotShownFlag() // used by Selenium test
Please find below example using Selenium "until.stalenessOf" and Jasmine assertion.
It returns true when element is no longer attached to the DOM.
const { Builder, By, Key, until } = require('selenium-webdriver');
it('should not find element', async () => {
const waitTime = 10000;
const el = await driver.wait( until.elementLocated(By.css('#my-id')), waitTime);
const isRemoved = await driver.wait(until.stalenessOf(el), waitTime);
expect(isRemoved).toBe(true);
});
For ref.: Selenium:Until Doc
The way that I have found best - and also to show in Allure report as fail - is to try-catch the findelement and in the catch block, set the assertTrue to false, like this:
try {
element = driver.findElement(By.linkText("Test Search"));
}catch(Exception e) {
assertTrue(false, "Test Search link was not displayed");
}
This is the best approach for me
public boolean isElementVisible(WebElement element) {
try { return element.isDisplayed(); } catch (Exception ignored) { return false; }
}
For a JavaScript (with TypeScript support) implementation I came up with something, not very pretty, that works:
async elementNotExistsByCss(cssSelector: string, timeout=100) {
try {
// Assume that at this time the element should be on page
await this.getFieldByCss(cssSelector, timeout);
// Throw custom error if element s found
throw new Error("Element found");
} catch (e) {
// If element is not found then we silently catch the error
if (!(e instanceof TimeoutError)) {
throw e;
}
// If other errors appear from Selenium it will be thrown
}
}
P.S: I am using "selenium-webdriver": "^4.1.1"
findElement will check the html source and will return true even if the element is not displayed. To check whether an element is displayed or not use -
private boolean verifyElementAbsent(String locator) throws Exception {
boolean visible = driver.findElement(By.xpath(locator)).isDisplayed();
boolean result = !visible;
System.out.println(result);
return result;
}
For appium 1.6.0 and above
WebElement button = (new WebDriverWait(driver, 10).until(ExpectedConditions.presenceOfElementLocated(By.xpath("//XCUIElementTypeButton[#name='your button']"))));
button.click();
Assert.assertTrue(!button.isDisplayed());