【问题标题】:Getting ElementNotVisibleException : Using Selenium WebDriver in MakeMyTrip.com for Date Picker获取 ElementNotVisibleException :在 MakeMyTrip.com 中为日期选择器使用 Selenium WebDriver
【发布时间】:2016-02-22 03:43:00
【问题描述】:

我想单击 makemytip.com 中的特定日期。我写了下面的代码。一切正常。除了我无法选择日期。我可以导航到我想要的月份,但无法选择日期。提前感谢您的帮助。

当我运行以下程序时,我收到以下错误

线程“main”org.openqa.selenium.ElementNotVisibleException 中的异常:元素当前不可见,因此可能无法与之交互

package com;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.concurrent.TimeUnit;

import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.firefox.FirefoxDriver;

public class Calendar_MMT {
    static WebDriver d;
    public static void main(String[] args) throws ParseException {
     d = new FirefoxDriver();
     d.manage().window().maximize();
        d.manage().timeouts().implicitlyWait(15, TimeUnit.SECONDS);
        d.get("http://makemytrip.com");
        d.findElement(By.xpath("//*[@id='start_date_sec']/span[1]/span[1]")).click();
    selectDate("02/03/2016");
    }


    public static void selectDate(String date) throws ParseException{
        SimpleDateFormat df=new SimpleDateFormat("dd/MM/yyyy");
        Date dateToBeSelected = df.parse(date);
        Date currentDate = new Date();
        String monthYearDisplayed = d.findElement(By.xpath("//*[@id='ui-datepicker-div']/div[1]/div/div")).getText();
        System.out.println(monthYearDisplayed);

        String month = new SimpleDateFormat("MMMM").format(dateToBeSelected);
        String year = new SimpleDateFormat("yyyy").format(dateToBeSelected);
        String day = new SimpleDateFormat("d").format(dateToBeSelected);
        String monthYearToBeSelected = month+" "+year;
        System.out.println(monthYearToBeSelected);

        while(true){
        if(monthYearToBeSelected.equals(monthYearDisplayed)){

// I FEEL BELOW LINE HAS PROBLEM
                d.findElement(By.xpath("//a[text()='"+day+"']")).click();
                System.out.println("Found and Selected");
                break;

            }else{ //navigate to correct month and year
                if(dateToBeSelected.after(currentDate)){
                    d.findElement(By.xpath("//*[@id='ui-datepicker-div']/div[2]/div/a/span")).click();
                }else{
                    d.findElement(By.xpath("//*[@id='ui-datepicker-div']/div[1]/div/a/span")).click();
                }

            }
            monthYearDisplayed = d.findElement(By.xpath("//*[@id='ui-datepicker-div']/div[1]/div/div")).getText();
        }
    }
    }

【问题讨论】:

    标签: java selenium selenium-webdriver


    【解决方案1】:

    WebElement.click()不起作用,因为出于某种原因,WebDriver 认为 Web 元素不可见。要验证这一点,您可以执行:

    WebElement dayElement = d.findElement(By.xpath("//a[text()='" + day + "']"));
    System.out.println("isDisplayed: " + dayElement.isDisplayed()); //this will always print false
    

    要绕过可见性检查,您可以通过 javascript 执行点击:

    WebElement dayElement = d.findElement(By.xpath("//a[text()='" + day + "']"));
    JavascriptExecutor js = (JavascriptExecutor) d;
    js.executeScript("arguments[0].click();", dayElement);
    

    【讨论】:

    • 谢谢。到目前为止,我不喜欢使用 Java 脚本。没有js有可能吗?
    • 这段代码是java。我的意思是:您可以使用 WebDriver javascript 接口执行 javascript。还是您想避免这种情况?
    • 是的,西里尔。现在我想避免使用javascript。 (对不起,如果我错了或什么)
    • 是的。我已经检查过了,它是不可见的。如何使其可见并单击?
    【解决方案2】:

    我注意到您的元素与其父元素 (td) 重叠,因此我们无法直接访问它。因此,让我们尝试直接访问父 (td) 标签。

    现在有两种方式:

    第一个是使用元素的一些属性直接访问元素:

    d.findElement(By.xpath("//td[@fare-date='2-2-2016']")).click();
    

    第二种可能是您想要的自定义方式,其中传递了一个变量。

    List<WebElement> e = d.findElements(By.xpath("//td[@data-handler='selectDay']"));
    for(WebElement we:e){     
     if(we.getText().equals(day)){
        we.click();
        break;
     }
    }
    

    请注意,这里我们可能无法直接在定位器中使用 text() 函数来识别该父级,因为文本包含在子级标记中。所以我们使用 getText() 代替。

    此函数的作用是将所有父单元格存储到一个列表中,并逐个检查每个单元格的内容,除非匹配所需的值。

    希望对你有帮助:)

    【讨论】:

      【解决方案3】:

      在这里显式等待可能会有所帮助

      WebDriver driver = new FirefoxDriver();
      driver.get("http://somedomain/url_that_delays_loading");
      WebElement myDynamicElement = (new WebDriverWait(driver, 10)).until(ExpectedConditions.presenceOfElementLocated(By.id("myDynamicElement")));
      

      来源:http://www.seleniumhq.org/docs/04_webdriver_advanced.jsp

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-02-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-03-22
        • 2018-01-17
        • 2023-03-18
        • 1970-01-01
        相关资源
        最近更新 更多