【问题标题】:Selenium List <WebElement> always returns nullSelenium List <WebElement> 总是返回 null
【发布时间】:2017-01-21 22:42:46
【问题描述】:

getoption 用于从下拉菜单中检索值时,Selenium List&lt;WebElement&gt; 返回零。

代码sn-p:

public class FaceBookdropDownMenu {
    public static void main(String[] args) throws InterruptedException {
        System.getProperty("webdriver.gecko.driver", "//usr//local//bin//geckodriver 6");
        WebDriver driver = new FirefoxDriver();
        driver.manage().window().maximize();
        driver.get("https://www.facebook.com/");

        WebElement month_dropdown = driver.findElement(By.id("month"));
        //return a list of month names
        System.out.println(month_dropdown.getText());
        List<WebElement> month_lists = driver.findElements(By.id("month"));   
        int total_month= month_lists.size();
        // returns 1 instead of 12 
        System.out.println("Total month count is"+ total_month);

        for(WebElement ele:month_lists) {
            String month_name = ele.getText();
            System.out.println("Months are:"+ month_name); 
        }
    }
}

================================================ ======================== 我使用getOptions(),但它也不起作用

WebElement month_dropdown =driver.findElement(By.id("month"));
System.out.println(month_dropdown.getText());
Select month_dd = new Select(month_dropdown);
List <WebElement> month_lists = month_dd.getOptions();       
int total_month= month_lists.size();
//Zero is returned instead of 12
System.out.println("Total month count is"+ total_month);

for(WebElement ele:month_lists) {
    String month_name = ele.getText();
    System.out.println("Months are:"+ month_name);
}

【问题讨论】:

  • 你到底想做什么?感觉离你不远了,但很难理解你想做什么。
  • 我想显示总月数 (12) 并列出月份名称,从 1 月到 12 月
  • 请贴出相关的HTML
  • 您使用的是什么版本的Selenium 和 FireFox?尝试在旧版本中使用第二个代码 sn-ps。

标签: java selenium selenium-webdriver


【解决方案1】:

以下代码对我有用:

import java.util.List;
import java.util.Random;
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.Select;
import org.openqa.selenium.support.ui.WebDriverWait;

public class FacebookDateSelect {

    public static void main(String[] args) {


        WebDriver driver = new ChromeDriver();
        driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
        driver.get("https://www.facebook.com/");
        driver.manage().window().maximize();

        WebDriverWait wait = new WebDriverWait(driver, 20);
        WebElement month_dropdown = wait.until(ExpectedConditions.visibilityOfElementLocated(By.id("month")));
        Select month_dd = new Select(month_dropdown);
        List <WebElement> month_lists = month_dd.getOptions();       
        int total_month= month_lists.size();
        System.out.println("Total month count is"+ total_month);

        for(WebElement ele:month_lists) {
            String month_name = ele.getText();
            System.out.println("Months are:"+ month_name);
        }

        //updated code - to select random option using Random class
        month_dd.selectByIndex(new Random().nextInt(user_country.getOptions().size()));
        driver.quit();

    }

}

在您的代码中,

List<WebElement> month_lists = driver.findElements(By.id("month"));

总是返回一个元素,因为只有一个 id 为 month 的元素。这确实会返回其中的选项(使用 getOptions 方法)

我做的另一个改变是使用WebDriverWait,有明确的等待条件(直到网页上显示月份下拉菜单),检查给定的持续时间(20秒)。如果元素本身在第一秒内找到,该元素将被返回,它不会等到 20 秒。同样,如果20秒后没有找到该元素,则会抛出Timeout异常。

我得到的输出:

Starting ChromeDriver 2.25.426923 (0390b88869384d6eb0d5d09729679f934aab9eed) on port 6720
Only local connections are allowed.
Total month count is13
Months are:Month
Months are:Jan
Months are:Feb
Months are:Mar
Months are:Apr
Months are:May
Months are:Jun
Months are:Jul
Months are:Aug
Months are:Sept
Months are:Oct
Months are:Nov
Months are:Dec

【讨论】:

  • OP 已经尝试使用Select,但对他不起作用。下拉列表中的getText() 是如何解决问题的?
  • @Guy 当我在没有任何修改的情况下运行时,OP 发布的相同代码对我有用。添加了getTextgetOptions 方法的输出。所以,我认为这是与页面加载有关的问题,因此将代码更新为Explicit Wait。 OP,请更新我的代码是否有效,
  • // first option - using getText method 评论是您添加的,您似乎在建议将其作为解决方案。
  • 如果问题是定位下拉菜单,显式等待可能会有所帮助。问题是getOptions() 没有返回下拉菜单下的选项。
  • @Guy,感谢您的建议。删除了 getText,因为它不是检索 OPTIONS 的首选方式。我认为问题是由于页面加载速度慢,因为代码对我来说工作正常。您也可以尝试一下,看看问题是否在您最后重现。
猜你喜欢
  • 1970-01-01
  • 2020-12-17
  • 2014-03-04
  • 2016-11-02
  • 2014-05-06
  • 2012-06-05
  • 2014-05-30
  • 2014-02-23
  • 2017-10-12
相关资源
最近更新 更多