Selenium webdriver Not able to click on log out - selenium

driver.findElement(By.linkText("Log Out")).click();
I used above line of code to logout.Until yesterday it was working but today it is not.
I have used below xpath:-
driver.findElement(By.xpath("/html/body/div/div[3]/div[1]/div/ul[2]/li/div/ul/li[3]/a")).click();
It is still not working,
Later I found that I focus on logout option than it does the operation of logout.
Why is it so?
and why it was working yesterday but not today?

One possible issue may be that your browser is loading cached page that has broken logout button . You need to give more strict Xpath and wait to make sure the whole page load
"/html/body/div/div[3]/div[1]/div/ul[2]/li/div/ul/li[3]/a"
Make it strict something like -
driver.findElement(By.xpath("//Button[text()='logout']")).click();

Try to use
driver.findElement(By.partialLinkText("Log Out")).click();
Or
driver.findElement(By.xpath("//a[contains(text(),'Log Out')]")).click();

A stack trace might be very helpful to find a solution for you.
It could be, that
the dropdown menu entry for log out needs short time to become visible?
Selenium acts like a user and can interacts with visible elements.
You could click on the dropdown use WebDriverWait.Until(..) to wait until it appears and use it
or
Another way might be navigating directly to log out url.
the link text has changed (blanks, capital letters ..)

Try doing this -
WebElement element = driver.findElement(By.linkText("Log Out"));
JavascriptExecutor executor = (JavascriptExecutor)driver;
executor.executeScript("arguments[0].click();", element);

Related

Element not interacable

I have this error "element not interactable" When I try to click a drop down list with selenium. However in debug mode, when I inspect ( press F12 ) before the break points and I continue to run then the test is passed. So my question is Why the elements can be clicked and what should I do to prevent the situation again. Many thanks!
You have to add wait / delay before accessing the elements to let the elements be fully loaded on the page before accessing them.
The simplest way is to add hardcoded sleep, like
time.sleep(5)
The better way is to use explicit way implemented by expected conditions.
Few things to note down,
Always launch browser in full screen mode.
driver.maximize_window()
this code should be written before driver.get()
Whenever you get element not interactable, try to use action chains to click or send_keys :
something like this :-
from selenium.webdriver.common.action_chains import ActionChains
action = ActionChains(driver)
action.move_to_element('your web element here').click().perform()
Make sure that using Selenium, the desired web element should be in Selenium view port.
in order to resolve this, you may have to scroll down to let Selenium know where exactly the element is.

Selenium Webdriver with Java: Not able to locate element on the browser popup window

Go to this URL: https://sports.ladbrokes.com/en-gb/
Click on "JOIN NOW" at the top right of the window
It opens a window pop up, where I need to enter 'First name' and other info
Though the 'First name' input box has the input tag with name attribute in the DOM, I am not able to find it with usual way. Please suggest!
When I say usual way, something straight forward like below is not working:
driver.findElement(By.xpath("//input[#name='firstname']"));
driver.findElement(By.xpath("//input[#placeholder='First name']"))
It's an iframe which means you have to switch to the iframe first before you can locate elements there.
this is untested but something similar to this
driver.switchTo().frame("lightbox-registration-frame")
driver.findElement(By.xpath("//input[#name='firstname']"));
driver.findElement(By.xpath("//input[#placeholder='First name']"))
driver.switchTo().defaultContent(); // <- important if need to switch back to original window
You may also need to use a wait to allow the iframe to appear/load. I noticed it took a second or 2 to load so if you try to switch immediately you'll end up with an unable to find iframe exception.
Also note that in my example i used "lightbox-registration-frame" to find the iframe which may not necessarily be correct. Generally you want to use the name or id of the iframe which i didn't see so you may need to use an index or some other method to find the iframe.
First you have to enter into the iframe and then locate the fields. try below code it works for you:
WebDriver driver= new FirefoxDriver();
driver.get("https://sports.ladbrokes.com/en-gb/");
// click on the Join now button
driver.findElement(By.xpath(".//[#id='loginSubmit']/div[3]/button[2]")).click();
//find Locator of frame
WebElement frampath= driver.findElement(By.xpath(".//iframe[(#class='lightbox-registration-frame')]"));
//switch to frame for operations
driver.switchTo().frame(frampath);
driver.findElement(By.name("firstname")).sendKeys("fdf");
// more operations
//statement1 (operation you want to perform)
//statement2(operation you want to perform)
driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
//Switch to main page
driver.switchTo().defaultContent();

How to resolve org.openqa.selenium.WebDriverException?

I am writing an automated test and want to report bugs, if occur, directly in the repo at GitHub. The step which fails in my program is the Submit new issue button from GitHub Issue Tracker.
Here is the code:
WebElement sendIssue = driver.findElement(By.xpath("/html/body/div[5]/div/div/div[2]/div[1]/div/form/div[2]/div[1]/div/div/div[3]/button"));
sendIssue.click();
And the exception:
org.openqa.selenium.WebDriverException: Element is not clickable at
point (883, 547.7999877929688). Other element would receive the click:
div class="modal-backdrop"></div
The following command also does not work:
((JavascriptExecutor) driver).executeScript("arguments[0].click();", sendIssue);
How can I make it clickable? Is there any other way by which I can resolve this issue?
This is happening because when selenium is trying to click ,the desired element is not clickable.
You have to make sure that the Xpath provided by you is absolutely right.If you are sure about the Xpath then try the following
replace
WebElement sendIssue = driver.findElement(By.xpath("/html/body/div[5]/div/div/div[2]/div[1]/div/form/div[2]/div[1]/div/div/div[3]/button"));
sendIssue.click();
with
WebElement sendIssue =(WebElement)new WebDriverWait(DRIVER,10).until(ExpectedConditions.elementToBeClickable(By.xpath("/html/body/div[5]/div/div/div[2]/div[1]/div/form/div[2]/div[1]/div/div/div[3]/button")));
sendIssue.click();
If that doesn't work ,You will get an Timeout exception, In that case try incaresing the timeout amount from 10 to 20.
If it still doesn't work please post a screenshot of the HTML.
You need to write something in the issue title and description to make the issue clickable are you sure you are not making that mistake of clicking the button without writing anything in those places I am adding screenshot for your convenience.
Selenium Webdriver introduced in a previous version (v2.48) a new behavior that prevent clicks on elements that may be overlapped for something else (a fixed header or footer - for example) or may not be at your viewport (visible area of the webpage within the browser window).
You can see the debate here.
To solve this you will need to scroll (up or down) to the element you're trying to click.
One approach would be something like this post:
Page scroll up or down in Selenium WebDriver (Selenium 2) using java
Another, and maybe more reasonable, way to create a issue on Github, would be using their API. Maybe it would be good to check out!
Github API - Issues
Gook luck.
This worked for me. Instead of HTML browser this would be useful if we perform intended Web Browser
// Init chromedriver
String chromeDriverPath = "/Path/To/Chromedriver" ;
System.setProperty("webdriver.chrome.driver", chromeDriverPath);
ChromeOptions options = new ChromeOptions();
options.addArguments("--headless", "--disable-gpu", "--window-size=1920,1200","--ignore-certificate-errors");
WebDriver driver = new ChromeDriver(options);

Selenium, what is the best practice to deal with element is not clickable

I am using selenium 2.46 (firefox driver) to develop an application. There are a lot of element.click() in my code. Sometimes that elements are not visible or not clickable make the application throws selenium exception.
To resolve that issue, i use WebdriverWait(driver, 10).until(...) for each single element which needs to be clicked.
My question is there is any other better way Or design pattern that can help me to solve the problem best.
Or at least i dont have to use WebdriverWait for each single element needs to be click().
You cannot avoid WebDriverWait. If you send a webdriver click command, webdriver will blindly assume that "element is clickable". You need to instruct webdriver to wait because your element is special and needs some synchronization before it can click on it. I don't think you need to do this for every other element. You can incorporate ExpectedConditions so that you can keep your code snippets manageable and small. So something like,
WebDriverWait wait = new WebDriverWait(driver,30);
wait.until(ExpectedConditions.elementToBeClickable(By.id("foo"))).click();
The other option you can try other than clicking is hit enter on respective element, for that you can refer ID of that element.
driver.findElement(By.id("elementid")).sendKeys(Keys.ENTER);
use implicit wait instead of explicit wait and give the expected condition till the element doesn't visible on screen.
for more info you can check
http://selenium.googlecode.com/git/docs/api/java/org/openqa/selenium/support/ui/ExpectedConditions.html#invisibilityOfElementLocated-org.openqa.selenium.By-
Hope this will help you

How to click Image icon using selenium webdriver

I am trying to click the image icon via xPath but when i run the code the link present on image icon is not opening. could you please help me in resolving this issue.
The Code i used to click the mail icon :
driver.findElement(By.xpath("//*[#id='e-switcher-mail-icon']")).click();
As slanec said more information is required or might be the element is not loaded. If u feel that the element has loaded and still its not happening, using java script is one way to click the image element.
Something like this
WebElement element = driver.findElement (By.xpath ("//*[#id='e-switcher-mail-icon']"));
JavascriptExecutor executor = (JavascriptExecutor) driver;
executor.executeScript ("arguments[0].click();" , element);
Could be that the element hasn't yet loaded in the DOM. Try waiting for expected conditions:
Wait<WebDriver> wait= new FluentWait<WebDriver>(driver).withTimeout(15L, TimeUnit.SECONDS).pollingEvery(1, TimeUnit.SECONDS);
WebElement icon = wait.until(ExpectedConditions.presenceOfElementLocated(By.xpath("//*[#id='e-switcher-mail-icon']")));
icon.click();
Touché. It's the frames. Either <frame> or <iframe>, both need special care, see the documentation on the topic.
What you need to do:
driver.switchTo().frame("s_MainFrame");
after this, the driver's context will switch to the frame and all searches will be done in it, so you should be able to find the element without any further problems.
Once you're done in the frame and you need to switch back to the default context of the page, do:
driver.switchTo().defaultContent();