方法click()在下拉列表

时间:2017-05-05 13:40:20

标签: java selenium selenium-webdriver

有人可以帮我解决我的问题吗? click()方法在以下代码的下拉列表中不起作用。

package com.driver;

import java.util.concurrent.TimeUnit;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.firefox.FirefoxDriver;

public class Listdown {

    static WebDriver driver;

    public static void main(String[] args) {
        driver = new FirefoxDriver();
        driver.manage().timeouts().implicitlyWait(5, TimeUnit.SECONDS);
        driver.manage().window().maximize();

        driver.get("https://accounts.google.com/SignUp?service=mail&hl=ru&continue=http%3A%2F%2Fmail.google.com%2Fmail%2F%3Fpc%3Dtopnav-about-ru");

        driver.findElement(By.xpath("(//strong[text()='Пол']/following-sibling::div/div[@role='listbox'])[1]")).click();
        driver.findElement(By.xpath("//div[text()='Мужской']/parent::div[@role='option']")).click();
     }
}

在结果中,我必须收到标记的复选框“Мужской”,但我没有。

添加html代码:

<div id="gender-form-element" class="form-element">
   <label id="gender-label">
     <strong id="GenderLabel">Пол</strong>
     <div id="Gender" class=" form-error" aria-invalid="true">
        <div class="goog-inline-block goog-flat-menu-button jfk-select" role="listbox" style="-moz-user-select: none;" aria-expanded="false" tabindex="0" aria-haspopup="true" title="Пол" aria-activedescendant=":d">
        <div class="goog-menu goog-menu-vertical" style="-moz-user-select: none; visibility: visible; left: 0px; top: 21.5px; display: none;" role="listbox" aria-haspopup="true">
           <div id=":e" class="goog-menuitem" role="option" style="-moz-user-select: none;">
           <div id=":f" class="goog-menuitem" role="option" style="-moz-user-select: none;">
              <div class="goog-menuitem-content">Мужской</div>
           </div>
           <div id=":g" class="goog-menuitem" role="option" style="-moz-user-select: none;">
           <div id=":h" class="goog-menuitem" role="option" style="-moz-user-select: none;">
        </div>
        <input id="HiddenGender" type="hidden" name="Gender"/>
     </div>
   </label>
   <span id="errormsg_0_Gender" class="errormsg" role="alert">Это поле должно быть заполнено.</span>

2 个答案:

答案 0 :(得分:0)

实际上你的代码工作正常 我已经在我的环境中尝试过了,正确地从下拉列表中选择了文本 我唯一改变的是我添加了gecko驱动程序的路径

这是您在我的机器上运行的已编辑代码:

public class test1 {
    static WebDriver driver;

public static void main(String[] args) {
    System.setProperty("webdriver.gecko.driver", "C:\\Eclipse\\geckodriver\\geckodriver.exe");
    driver = new FirefoxDriver();
    driver.manage().timeouts().implicitlyWait(5, TimeUnit.SECONDS);
    driver.manage().window().maximize();

    driver.get("https://accounts.google.com/SignUp?service=mail&hl=ru&continue=http%3A%2F%2Fmail.google.com%2Fmail%2F%3Fpc%3Dtopnav-about-ru");

    driver.findElement(By.xpath("(//strong[text()='Пол']/following-sibling::div/div[@role='listbox'])[1]")).click();
    driver.findElement(By.xpath("//div[text()='Мужской']/parent::div[@role='option']")).click();
}
}

我正在使用gecko驱动程序:geckodriver-v0.14.0-win64

我的Firefox浏览器版本是:51.0.1

因此问题可能与您的环境有关

答案 1 :(得分:-1)

相反,您可以将WebElement变形为选择对象并使用如下所示的方法:

Select dropdown = new Select(driver.findElement("Your locator goes here"));
dropdown.selectByVisibleText("Мужской");

如果您愿意,可以使用selectByValue()或selectByIndex代替以前的方法。

修改

我看过您正在处理的页面并修改了您的代码。

首先,点击下拉列表:

driver.findElement(By.cssSelector("#Gender > div > div")).click();

然后,按如下方式调用该方法:

selectItemFromList(By.cssSelector("#Gender > div[class='goog-menu goog-menu-vertical'] > div > div"), "Your item name goes here");  // you can any locator here for other dropdown menu

这是您之前调用的方法实现:

static void selectItemFromList(By element, String itemName){
          List<WebElement> itemList = driver.findElements(element);

            for(WebElement item : itemList){
                if(item.getText().trim().equals(itemName)){
                    item.click();
                    break;
                }
            }
      }