I am not able to find elements in selenium [duplicate] - java

This question already has answers here:
NoSuchElementException, Selenium unable to locate element
(3 answers)
Closed 4 years ago.
I am trying to run the below selenium code and I am getting an exception:
package demos;
import java.util.concurrent.TimeUnit;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.support.ui.ExpectedConditions;
import org.openqa.selenium.support.ui.WebDriverWait;
public class AmazonLogin {
public static void main(String[] args) throws InterruptedException {
WebDriver driver;
// Go to website and login
driver = utilites.DriverFactor.open("chrome");
driver.get("https://www.amazon.in/your-account");
WebElement loginName = driver.findElement(By.xpath("/html/body/div[1]/div[2]/div/div[2]/div[2]/a/div/div"));
WebElement emailId = driver.findElement(By.xpath("//*[#id=\"ap_email\"]"));
// WebElement continueButton=driver.findElement(By.id("continue"));
// WebElement password=driver.findElement(By.name("password"));
// WebElement loginButton=driver.findElement(By.id("signInSubmit"));
// WebElement message=driver.findElement(By.className("nav-line-1"));
//
loginName.click();
emailId.sendKeys("aryan.ragavan#gmail.com");
}
}
Exception in thread "main" org.openqa.selenium.NoSuchElementException: no such
element:
Unable to locate element: {"method":"xpath","selector":"//*[#id="ap_email"]"}
Selenium is trying to find webelement emailid before it clicks loginName webelement. Please help.

This is because you are trying to read the emailId field before you have clicked on login. Move the following line below loginName.click() statement.
WebElement emailId = driver.findElement(By.xpath("//*[#id=\"ap_email\"]"));

the issue is you are searching for 'app_element' on the main page of amazon.
Introduce yourself to POM implementation here:
https://www.guru99.com/page-object-model-pom-page-factory-in-selenium-ultimate-guide.html
DO-NOT use absolute xpath in any case as you did here:
findElement(By.xpath("/html/body/div[1]/div[2]/div/div[2]/div[2]/a/div/div"));
Here is an example of login logic for amazon:
#Test
public void amazon_login() {
browseToUrl("https://www.amazon.in/your-account");
// select login & security option
WebElement loginAndSecurityBtn = driver.findElement(By.xpath("//div[#data-card-identifier='SignInAndSecurity']"));
// navigate to the next page
loginAndSecurityBtn.click();
// enter email or phone
WebElement emailOrPhoneInput = driver.findElement(By.id("ap_email"));
emailOrPhoneInput.sendKeys("example#email.com");
// click continue btn
WebElement continueBtn = driver.findElement(By.id("continue"));
continueBtn.click();
// enter password
WebElement passwordInput = driver.findElement(By.id("ap_password"));
passwordInput.sendKeys("password");
// login
WebElement loginBtn = driver.findElement(By.id("signInSubmit"));
loginBtn.click();
}

For Amazon Login, You Can Refer This Code . or Below POM(PageobjectModel) Code
package TestId;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.interactions.Actions;
import org.openqa.selenium.support.ui.ExpectedCondition;
import org.openqa.selenium.support.ui.ExpectedConditions;
import org.openqa.selenium.support.ui.WebDriverWait;
import org.testng.annotations.AfterTest;
import org.testng.annotations.Test;
public class NewTest {
WebDriver driver;
#Test
public void f()
{
System.setProperty("webdriver.chrome.driver", "E:\\New Folder\\chromedriver.exe");
driver = new ChromeDriver();
driver.manage().window().maximize();
driver.get("https://www.amazon.in/your-account");
WebElement e1 = driver.findElement(By.xpath("//*[#id='nav-link-yourAccount']/span[2]"));
WebElement e2 = driver.findElement(By.xpath("//*[#id='nav-flyout-ya-signin']/a/span"));
Actions a1 = new Actions(driver);
a1.moveToElement(e1).click(e2).build().perform();
}
#AfterTest
public void CheckLogin()
{
WebElement e3 = driver.findElement(By.xpath("//*[#id='authportal-main-section']/div[2]/div/div[1]/form/div/div/div"));
WebDriverWait wait = new WebDriverWait(driver, 5);
WebElement e4 = wait.until(ExpectedConditions.visibilityOf(e3));
if(e4.isDisplayed())
{
driver.findElement(By.id("ap_email")).sendKeys("Test#gmail.com");
System.out.println("Email Successfully Passed");
}
}
}
I Used Webdriver Wait because, i Need to Wait Until The Login Page is Loaded and i Used an if-Condition because after The Page is Displayed Pass The Email id.
if You Find Difficultly in Above Use Use Below POM Method.
Amazon Login Using POM:
package POM;
import org.apache.xmlbeans.impl.xb.xsdschema.Public;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.interactions.Actions;
import org.openqa.selenium.support.FindBy;
import org.openqa.selenium.support.How;
import org.openqa.selenium.support.ui.ExpectedConditions;
import org.openqa.selenium.support.ui.WebDriverWait;
public class Pageobject
{
WebDriver driver;
public Pageobject(WebDriver driver)
{
this.driver=driver;
}
#FindBy(xpath = "//*[#id='nav-link-yourAccount']/span[2]")
public WebElement Siginpath;
#FindBy(how=How.XPATH,using="//*[#id='nav-flyout-ya-signin']/a/span")
public WebElement clicksignin;
#FindBy(how=How.XPATH,using="//*[#id='authportal-main-section']/div[2]/div/div[1]/form/div/div/div")
public WebElement ElementtobeVisible;
#FindBy(how=How.ID,using="ap_email")
public WebElement Email;
public void Loginpage(String email)
{
Actions a1 = new Actions(driver);
a1.moveToElement(Siginpath).click(clicksignin).build().perform();
WebDriverWait wait = new WebDriverWait(driver, 5);
WebElement e4 = wait.until(ExpectedConditions.visibilityOf(ElementtobeVisible));
if(e4.isDisplayed())
{
Email.sendKeys(email);
}
}
}
Test Case For POM :
package POMtestcase;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.support.PageFactory;
import org.testng.annotations.Test;
import POM.Pageobject;
public class Pomtest
{
WebDriver driver;
#Test
public void Checkvaliduser()
{
System.setProperty("webdriver.chrome.driver", "E:\\New Folder\\chromedriver.exe");
driver = new ChromeDriver();
driver.manage().window().maximize();
driver.get("https://www.amazon.in/your-account");
Pageobject object = PageFactory.initElements(driver, Pageobject.class); //Calling The Class Here
object.Loginpage("test#gmail.com");//Passing the Mail id
}
}

Related

How to select the autocomplete result that contains a certain phrase within the website https://www.easyjet.com/en using Selenium and Java

I am practicing against the following website https://www.easyjet.com/en
I am passing a value of "London" into the Origin search box. This returns six airport matches. I'm then trying to trawl through the results and select the one that contains the word "Luton".
My code so far is:
package d_practise;
import org.openqa.selenium.By;
import org.openqa.selenium.Keys;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;
public class easyjetMenu {
public static void main(String[] args) throws InterruptedException {
System.setProperty("webdriver.chrome.driver", "C:\\Work\\Drivers\\chromedriver.exe");
WebDriver driver = new ChromeDriver();
driver.manage().window().maximize();
driver.get("https://www.easyjet.com/");
Thread.sleep(2000);
WebElement d = driver.findElement(By.cssSelector("input[name='origin']"));
d.click();
d.sendKeys("London");
while(!d.getText().contains("Luton")) {
d.sendKeys(Keys.DOWN);
}
if(d.getText().contains("Luton")) {
d.sendKeys(Keys.ENTER);
}
}
}
This just continuously loops and no match is found. I have tried various phrases but no joy.
Anyone please able to help?
On passing the value of London into the Origin search box, to click on the autocomplete/autosuggestion with text as Luton you have to induce WebDriverWait for the visibilityOfAllElementsLocatedBy() and then click() on the desired element using the following Locator Strategy:
Code Block:
import java.util.Collections;
import java.util.List;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.chrome.ChromeOptions;
import org.openqa.selenium.support.ui.ExpectedConditions;
import org.openqa.selenium.support.ui.WebDriverWait;
public class easyjet_com_origin {
public static void main(String[] args) {
System.setProperty("webdriver.chrome.driver","C:\\WebDrivers\\chromedriver.exe");
ChromeOptions options = new ChromeOptions();
options.addArguments("--start-maximized");
options.setExperimentalOption("excludeSwitches", Collections.singletonList("enable-automation"));
options.setExperimentalOption("useAutomationExtension", false);
WebDriver driver = new ChromeDriver(options);
driver.get("https://www.easyjet.com/en/");
WebElement d = new WebDriverWait(driver, 20).until(ExpectedConditions.elementToBeClickable(By.cssSelector("input[name='origin']")));
d.click();
d.sendKeys("London");
//List<WebElement> origins = new WebDriverWait(driver, 20).until(ExpectedConditions.visibilityOfAllElementsLocatedBy(By.xpath("//ul[#id='ui-id-1']//li/a/span")));
List<WebElement> origins = new WebDriverWait(driver, 20).until(ExpectedConditions.visibilityOfAllElementsLocatedBy(By.cssSelector("ul#ui-id-1 li>a>span")));
for(WebElement origin:origins)
{
if(origin.getText().contains("Luton"))
origin.click();
}
}
}
Browser Snapshot:

I have 100+ button in the page and I have to click on each button and to verify the link and page which opens after clicking

I have 100+ button in the page and I have to click on each button and to verify the link and page which opens after clicking.
so how to click without writing xpath for all 100+ button, i just need to click them and for each button different page will open.
Pls help me to proceed my selenium test
After you click the first button a new DOM is loaded, so click on the second (and third ...) will end with StaleElementReferenceException. You need to get all the href values first and then try them one by one. Just tried on web bbc.com with this code:
package navi;
import java.util.ArrayList;
import java.util.List;
import org.junit.After;
import org.junit.AfterClass;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.openqa.selenium.firefox.FirefoxOptions;
import org.openqa.selenium.firefox.FirefoxProfile;
import org.openqa.selenium.firefox.internal.ProfilesIni;
import org.openqa.selenium.support.ui.ExpectedConditions;
import org.openqa.selenium.support.ui.WebDriverWait;
public class Himanshu {
public static WebDriver driver;
#BeforeClass
public static void setUpClass() {
FirefoxOptions options = new FirefoxOptions();
ProfilesIni allProfiles = new ProfilesIni();
FirefoxProfile selenium_profile = allProfiles.getProfile("selenium_profile");
options.setProfile(selenium_profile);
options.setBinary("C:\\Program Files (x86)\\Mozilla Firefox\\firefox.exe");
System.setProperty("webdriver.gecko.driver", "C:\\Users\\pburgr\\Desktop\\geckodriver-v0.20.0-win64\\geckodriver.exe");
driver = new FirefoxDriver(options);
driver.manage().window().maximize();
}
#Before public void setUp() {} #After public void tearDown() {}
#AfterClass public static void tearDownClass() {driver.quit();}
#Test
public void lots_of_buttons() throws InterruptedException {
driver.get("http://www.bbc.com/");
// wait to page is fully loaded
wait_sec(driver, 5).until(ExpectedConditions.elementToBeClickable(By.xpath("//*[#id=\"orb-header\"]/div[1]/div[1]/a/img")));
// get all the desired webelements
List<WebElement> header_links = driver.findElements(By.xpath("//a[contains(#href,'x')]"));
// create new arraylist
ArrayList<String> hrefs = new ArrayList<String>();
// collect all the href values
for (WebElement link: header_links) {
hrefs.add(link.getAttribute("href"));
}
// visit all the URLs
for (String url: hrefs) {
driver.get(url);
Thread.sleep(1000);
// do some stuff here
}
}
// modified wait method
public WebDriverWait wait_sec(WebDriver driver, int sec) {
return new WebDriverWait(driver, sec);
}
}

How to test or verify check box is selected or not selected by using selenium webdriver java

How to test or verify check box is selected or not selected by using selenium webdriver java
package newpackage;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.openqa.selenium.WebElement;
//import org.openqa.selenium.firefox.*;
import java.util.concurrent.*;
public class Qemr { public static void main(String[]args){
System.setProperty("webdriver.gecko.driver","D:\\geckodriver-v0.10.0-win64\\geckodriver.exe");
WebDriver driver = new FirefoxDriver();
String baseUrl = "http://192.168.1.3:9091";
driver.get(baseUrl);
WebElement chkPersist = driver.findElement(By.name("remember"));
chkPersist=click();
for(int i=0;i<2;i++){
System.out.println("chkPersist.isChecked()");
}
}
}
yes there are methods available which you can use for ny kind of controls, for eg. for check box you can use isSelected() method which returns boolean value i.e. 0/1
for your scenario
package newpackage;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.openqa.selenium.WebElement;
//import org.openqa.selenium.firefox.*;
import java.util.concurrent.*;
public class Qemr {
public static void main(String[]args)
{
System.setProperty("webdriver.gecko.driver","D:\\geckodriver-v0.10.0-win64\\geckodriver.exe");
WebDriver driver = new FirefoxDriver();
String baseUrl = "http://192.168.1.3:9091";
driver.get(baseUrl);
WebElement chkPersist = driver.findElement(By.name("remember"));
//chkPersist.click();
if(chkPersist.isSelected())
{
System.out.println("Check box is Selected..");
}
}
}
driver.findElement("").isSelected() option is there to check whether Checkbox is selected. you can find solution in your updated code:
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.openqa.selenium.WebElement;
//import org.openqa.selenium.firefox.*;
import java.util.concurrent.*;
public class StackOverFlow1
{
public static void main(String[]args)
{
System.setProperty("webdriver.gecko.driver","D:\\geckodriver-v0.10.0-win64\\geckodriver.exe");
WebDriver driver=new FirefoxDriver();
String baseUrl="http://192.168.1.3:9091";
driver.get(baseUrl);
boolean chkPersist=driver.findElement(By.name("remember")).isSelected();
if(chkPersist)
{
System.out.println("chkPersist is in selected state");
}
}
}
}
Question : How to test or verify check box is selected or not selected by using selenium webdriver java.
Answer : Yes we can verify webelement is selected or not using isSelected() method
package newpackage;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.openqa.selenium.WebElement;
import java.util.concurrent.*;
public class Qemr {
public static void main(String[] args) {
System.setProperty("webdriver.gecko.driver", "D:\\geckodriver-v0.10.0-win64\\geckodriver.exe");
WebDriver driver = new FirefoxDriver();
String baseUrl = "http://192.168.1.3:9091";
driver.get(baseUrl);
WebElement chkPersist = driver.findElement(By.name("remember"));
// Verify chkPersist element is Selected or Not ?
if (chkPersist.isSelected()) {
// if chkPersist element is selected then we print message
System.out.println("chkPersist element is already selected");
} else {
// if chkPersist element is not selected then we select / click on chkPersist element
chkPersist.click();
}
}
}

Selection menu from context click

I'm facing an issue while automating right-click and then selecting any options from it.
The code is working fine in Firefox but not in Chrome.
There, it seems it is just showing a right click but doing a normal click on the element.
I am using chromedriver 2.21 and Selenium 2.50.
package mentor.qa.selenium;
import org.junit.Test;
import org.openqa.selenium.By;
import org.openqa.selenium.Keys;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.openqa.selenium.interactions.Actions;
import org.openqa.selenium.support.ui.WebDriverWait;
public class Stack {
public static void main(String[] args) throws InterruptedException {
System.setProperty("webdriver.chrome.driver", "C:\\Selenium\\chromedriver.exe");
// WebDriver driver = new FirefoxDriver();
WebDriver driver = new ChromeDriver();
driver.get("http://www.google.com/");
WebDriverWait wait = new WebDriverWait(driver, 30);
Thread.sleep(3000);
WebElement b = driver.findElement(By.linkText("About"));
Actions action = new Actions(driver);
action.moveToElement(b);
Thread.sleep(4000);
// Keys move = Keys.ARROW_DOWN;
// action.contextClick(b).sendKeys(move).sendKeys(Keys.ENTER).build().perform();
action.contextClick(b).sendKeys(Keys.ARROW_DOWN).sendKeys(Keys.ARROW_DOWN).build().perform();
Thread.sleep(4000);
action.click().build().perform();
// action.keyDown(Keys.CONTROL).click().build().perform();
// action.contextClick(b).sendKeys(Keys.CONTROL).keyDown(Keys.CONTROL).sendKeys(String.valueOf(d)).sendKeys(Keys.ENTER).build().perform();
// action.click();
// action.contextClick(b);
Thread.sleep(4000);
// action.sendKeys(Keys.ARROW_DOWN).sendKeys(Keys.RETURN).build().perform();
// driver.findElement(By.partialLinkText("new tab")).click();
// action.sendKeys(Keys.RETURN).perform();
Thread.sleep(4000);
//driver.quit();
}
}

Selenium Send Keys not Working with java while submitting a form

I am not able to perform the send keys operation while submitting a form using the locator method (Xpath). While submitting the forms or while login I am not able to find the element by using the xpath.
package accomplishment_Tracker;
import java.util.concurrent.TimeUnit;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.openqa.selenium.firefox.FirefoxProfile;
import org.testng.annotations.AfterTest;
import org.testng.annotations.BeforeTest;
import org.testng.annotations.Test;
public class ects {
public WebDriver driver;
#BeforeTest
public void openurl(){
//driver =new FirefoxDriver();
FirefoxProfile firefoxProfile = new FirefoxProfile();
firefoxProfile.setPreference("reader.parse-on-load.enabled",false);
driver = new FirefoxDriver(firefoxProfile);
driver.get("http://66.192.160.50/ects/");
driver.manage().window().maximize();
driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
System.out.println("Website opened succesfully");
}
//LOGIN
#Test
public void login(){
driver.findElement(By.xpath("html/body/div[1]/div/div/div/div[2]/form/fieldset/div[1]/input")).sendKeys("abcde");//("admin");
driver.findElement(By.xpath("/html/body/div[1]/div/div/div/div[2]/form/fieldset/div[2]/input")).sendKeys("password");
driver.findElement(By.xpath("/html/body/div[1]/div/div/div/div[2]/form/fieldset/div[3]/label/input")).click();
driver.findElement(By.xpath("/html/body/div[1]/div/div/div/div[2]/form/fieldset/input")).click();
}
#AfterTest
public void close(){
driver.quit();
}
}
Also how do I find out the frame id as frame(0).......
http://www.ecomnets.com/careers/submit-a-resume/
I am trying to fill in this form and I am not able to fill in the details using the selenium commands.
All Elements of your page are within iframe so you have to first switch to iframe :
Add following before login :
driver.switchTo().frame(0);
So it will be :
public void login(){
driver.switchTo().frame(0);
driver.findElement(By.xpath("html/body/div[1]/div/div/div/div[2]/form/fieldset/div[1]/input")).sendKeys("abcde");//("admin");
driver.findElement(By.xpath("/html/body/div[1]/div/div/div/div[2]/form/fieldset/div[2]/input")).sendKeys("password");
driver.findElement(By.xpath("/html/body/div[1]/div/div/div/div[2]/form/fieldset/div[3]/label/input")).click();
driver.findElement(By.xpath("/html/body/div[1]/div/div/div/div[2]/form/fieldset/input")).click();
}
I just checked , it should work now for you.

Categories