简体   繁体   中英

Selenium - Using Java to click on a dropdown list and select a value

I am trying to automate the download of a large set of indicators on a continuous basis. So far with the script I can open the URL, login, switch tab, and go to the desired section. I am having an issue clicking on a dropdown and selecting a value to extend the list from 10 to 100.

Here is my code thus far

SoltraDownload.java

import java.util.Scanner;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;


public class SoltraDownload {

public static void main(String[] args) {

    //PROMPT USER FOR Password
    //System.out.print("Please Enter Your Username: ");
    //Scanner scanner = new Scanner(System.in);
    //String username = scanner.next();

    //PROMPT USER FOR Username
    //System.out.print("Please Enter Your Password: ");
    //String password = scanner.next();

    //GET WEB DRIVER
    System.setProperty("webdriver.chrome.driver", "chromedriver.exe");
    WebDriver driver = new ChromeDriver();
    driver.get("EDITED FOR QUESTION");
    driver.manage().window().maximize();    

    //GET INSTANCE OF Soltra HOME PAGE
    SoltraHomePage SoltraHomePage = new SoltraHomePage(driver);

    //LOGIN TO SOLTRA
    SoltraHomePage.loginP("EDITED FOR QUESTION");
    SoltraHomePage.loginU("EDITED FOR QUESTION");
    SoltraHomePage.loginC();

    //MOVE TO FEEDS PAGE
    SoltraHomePage.FeedPage();

    //PAGE CLICK ON FEED SELECTION
    SoltraHomePage.ChooseFeed();

    //SELECT DROPDOWN value 100
    SoltraHomePage.Dropdown();
}

}

SoltraHomePage.java

import java.util.List;

import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.support.FindBy;
import org.openqa.selenium.support.How;
import org.openqa.selenium.support.PageFactory;
import org.openqa.selenium.support.ui.Select;
import org.openqa.selenium.htmlunit.HtmlUnitDriver;


public class SoltraHomePage {

@FindBy(how = How.ID, using = "username") private WebElement Username;
@FindBy(how = How.ID, using = "password") private WebElement Password;
@FindBy(how = How.ID, using = "loginbutton") private WebElement loginbutton;
@FindBy(how = How.LINK_TEXT, using = "Feeds") private WebElement Feeds;
@FindBy(how = How.ID, using = "feedlist") private WebElement feedlist;
@FindBy(how = How.CLASS_NAME, using = "container") private WebElement container;
@FindBy(how = How.LINK_TEXT, using = "Default") private WebElement Default;
@FindBy(how = How.CSS, using = "control-bar") private String control;

// Create a new instance of a driver
WebDriver driver = new HtmlUnitDriver();

public SoltraHomePage(WebDriver driver) {
    PageFactory.initElements(driver, this);
}

public void loginU(String text) {
    this.Username.clear();
    this.Username.sendKeys(text);
}

public void loginP(String text) {
    this.Password.clear();
    this.Password.sendKeys(text);
}

public void loginC(){
    this.loginbutton.click();
}

public void FeedPage() {
    this.Feeds.click();
}

public void ChooseFeed() {
    feedlist.findElement(By.partialLinkText("Default")).click();
}

public void Dropdown() {
    //Code to select dropdown value
}
}

Here is a subset of the html code - I am looking to choose the value 100 in the dropdown

<div class="row control-bar">

<div class="col-sm-4"></div>

<div class="col-sm-4">

<ul class="pager">

<li class="previous"><input type="button" class="btn btn-default" data-    bind="click: goFirst, disable: page()==1" value="&lt;&lt;"></li>

<li class="previous"><input type="button" class="btn btn-default" data-  bind="click: goPrev, disable: page()==1" value="&lt;"></li>

<li><small data-bind="text: page"></small> of <small data-bind="text: totalPages"></small> (<small data-bind="text: totalRows"></small>

<small data-bind="if: totalRows()!==1">rows</small><small data-bind="if: totalRows()==1">row</small>)</small></li>

<li class="next"><button class="btn btn-default" data-bind="click: goNext, disable: page() == totalPages()">&gt;</button></li>

<li class="next"><button class="btn btn-default" data-bind="click: goLast, disable: page() == totalPages()">&gt;&gt;</button></li>

</ul>
</div>
    <div class="col-sm-4">
    <ul class="pager">
        <li class="pull-right"><small>Indicators per page: </small>
            <select data-bind="value: pageSize, event: { change: loadData }" style="width:auto">
                <option value="5">5</option>
                <option value="10">10</option>
                <option value="20">20</option>
                <option value="50">50</option>
                **<option value="100">100</option>** //This is the value I am looking to choose
        </select>
    </li>
</ul>

I always create a custom actions class and place these in there:

public static void selectByValue(WebElement element, String value) {
    Select selectElement = new Select(element);
    selectElement.selectByValue(value);
}
public static void selectByText(WebElement element, String text) {
    Select selectElement = new Select(element);
    selectElement.selectByVisibleText(text);
}

These take your WebElement, convert it to a Select element (org.openqa.selenium.support.ui.Select), and use Select methods to select your option. This only works with html select elements. You would use it like so:

At the top:

@FindBy(how = How.CSS, using = "li.pull-right select") private WebElement soltraSelect;

In a test:

CustomActions.selectByValue(soltraSelect, "100");

You can do it with Select object or define a correct XPath:

1) Using Select:

Select element = new Select(webelement);
element.selectByValue(value);

2) Using XPath:

By option = By.xpath("//select[@class = 'expression']/option[@value = 'value']");
driver.findElement(option).click();

Since the value attribute has the same value as text I would suggest to go for the following cssSelector for better search result

String val = "100";
By css = By.cssSelector("select>option[value='" + val + "']");
driver.findElement(css).click();

On the other hand, you can use selectByValue method to accomplish the same thing instead to visual text. See the doc

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM