Kevster
Kevster

Reputation: 35

Selenium send keys (text), selecting from dropdown and hit enter

I'm trying to trawl this website: http://www.jackson-stops.co.uk/

The data is not showing in the URL so I'm using a chromedriver.

My code is:

   public static void main(String[] args) {
    //setup chromedriver
    File file = new File("C:\\Users\\USER\\Desktop\\chromedriver.exe");
    System.setProperty("webdriver.chrome.driver", file.getAbsolutePath());
    WebDriver driver = new ChromeDriver();
    try {
        driver.get("http://www.jackson-stops.co.uk/");
        //begin the simulation
        WebElement menu = driver.findElement(By.xpath("//*[@id=\"sliderLocation\"]"));
        ((JavascriptExecutor) driver).executeScript("arguments[0].scrollIntoView(true);", menu);
        menu.sendKeys("Knightsbridge");
        Thread.sleep(4000);
        Select menu2 = new Select(menu);
        menu2.selectByVisibleText("Knightsbridge");
        Thread.sleep(4000);
    } catch (Exception exp) {
        System.out.println("exception:" + exp);
        //close and quit windows
        driver.close();
        driver.quit();
    }
    //close and quit windows
    driver.close();
    driver.quit();
}

The error that I get is:

   exception:org.openqa.selenium.support.ui.UnexpectedTagNameException: Element should have been "select" but was "input"

How would I be able to select a location and hit enter because I tried inspecting the HTML and the options are dynamically loaded so not visible!

Upvotes: 0

Views: 23285

Answers (4)

Andrea
Andrea

Reputation: 11

WebElement selectMyElement = driver.findElement((By.xpath("//div/select/option[@value='Your value']")));
    selectMyElement.sendKeys("Your value");
    Actions keyDown = new Actions(myLauncher.getDriver());
    keyDown.sendKeys(Keys.chord(Keys.DOWN, Keys.DOWN)).perform();

Upvotes: 1

Kevster
Kevster

Reputation: 35

This is the full solution using Ranjeet's answer.

           File file = new File("C:\\Users\\USER\\Desktop\\chromedriver.exe");
    System.setProperty("webdriver.chrome.driver", file.getAbsolutePath());
    WebDriver driver = new ChromeDriver();
    try {
        driver.get("http://www.jackson-stops.co.uk/");
        //begin the simulation
        WebElement menu = driver.findElement(By.xpath("//*[@id=\"sliderLocation\"]"));
        ((JavascriptExecutor) driver).executeScript("arguments[0].scrollIntoView(true);", menu);
        menu.sendKeys("London");
        Thread.sleep(4000);
        String requiredCity = "London";
        List<WebElement> menu2 = driver.findElements(By.xpath("//ul[@id='ui-id-3']/li"));
        System.out.println("Total options: " + menu2.size());

        for (int i = 0; i < menu2.size(); i++) {
            String CurrentOption = menu2.get(i).getText();

            if (CurrentOption.contains(requiredCity)) {
                System.out.println("Found the city : " + CurrentOption);
                menu2.get(i).click();
                Thread.sleep(6000);
                menu.sendKeys(Keys.RETURN);
            }
        }
        Thread.sleep(8000);
    } catch (Exception exp) {
        System.out.println("exception:" + exp);
        //close and quit windows
        driver.close();
        driver.quit();
    }
    //close and quit 
    driver.close();
    driver.quit();

Upvotes: 0

Ranjeet
Ranjeet

Reputation: 24

You can do as below:

 String requiredCity = "London";
	        List<WebElement> menu2 = driver.findElements(By.xpath("//ul[@id='ui-id-3']/li"));
	        System.out.println("Total options: "+menu2.size());
	        
	        for(int i=0;i<menu2.size();i++)
	        {
	        	String CurrentOption = menu2.get(i).getText();
	        	
	        	if(CurrentOption.contains(requiredCity)){
	        		System.out.println("Found the city : "+CurrentOption);
		        	menu2.get(i).click();
	        	}
	        }

Upvotes: 1

RAJ
RAJ

Reputation: 898

You are trying to select an element but it's not select list, it's a link, So all you have to do is to click that element, that's all

First of all pass value

driver.findElement(By.xpath("//*[@id='sliderLocation']")).sendKeys("Knightsbridge")

Once it's done, it populate the values, So You need to click one of option, So you can directly click the element like this(since this population is taking time, you need to use implicit wait

driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS))

And then write

driver.findElement(By.xpath("//a[text()='Knightsbridge, London']")).click()

Or if you want to choose the element which consist of Knightsbridge then write the following code and this will choose the first option which consist of Knightsbridge then write

driver.findElement(By.xpath("//a[contains(text(),'Knightsbridge']")).click()

You don't have to use sleep statement anywhere in your selenium code, selenium automatically waits after the click until everything settle down properly. The one exceptional case is, If your page got refreshed after placing the value in your text box(Not necessary for select_list), then you need to use the implicit wait, otherwise even implicit wait is not necessary.

The above code I converted from Ruby to Java, the original code which I used to check is from selenium Ruby binding, the code is below

@driver.find_element(:xpath, "//*[@id='sliderLocation']").send_keys "Knightsbridge"
@driver.manage.timeouts.implicit_wait = 10
@driver.find_element(:xpath, "//a[contains(text(),'Knightsbridge')]").click
@driver.find_element(:xpath, "//a[text()='Knightsbridge, London']").click

Upvotes: 1

Related Questions