java - 如何使用 Java 处理与 Selenium 自动化中的其他元素重叠的日历?

标签 java selenium automation calendar selenium-chromedriver

我正在尝试实现以下场景 1.打开Chrome浏览器,打开greyhound.com 2. 通过选择来源地、目的地来搜索旅行。 3.选择一个开始日期,返回日期。 4. 最后,点击搜索按钮查找可用的公交车。

前四个字段工作正常。选择返回日期后,日历不会关闭,这会导致单击搜索按钮出现问题。 日历与搜索按钮重叠,使其不可点击。

为了克服这个问题,我使用了 Thread.sleep() 来为日历关闭留出一些时间并且它工作正常。 我如何使用 Selenium 等待概念来实现这一目标? 隐式和显式等待都不适合我。

    public class UsingChrome {
        public static void main(String args[]) throws InterruptedException {

            //Chrome Driver
            System.setProperty("webdriver.chrome.driver", "Y:\\Selenium\\chromedriver.exe");

            //Creating driver element
            WebDriver driver = new ChromeDriver();

            //Implicit Wait
            //driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);

            //To maximize browser window
            driver.manage().window().maximize();

            //Open webpage
            driver.get("https://www.greyhound.com/");

            //Scroll
            JavascriptExecutor jse = (JavascriptExecutor)driver;
            jse.executeScript("window.scrollBy(0,300)", "");

            //Select an origin and destination
            driver.findElement(By.id("fromLocation")).sendKeys("New York, NY");
            driver.findElement(By.id("toLocation")).sendKeys("Boston, MA");

            // To input a date using 'sendKeys'
            //Choose a Start Date
            driver.findElement(By.id("datepicker-from")).click();
            driver.findElement(By.id("datepicker-from")).sendKeys("10/22/2017");

            //Choose an End Date
            driver.findElement(By.id("datepicker-to")).click();
            driver.findElement(By.id("datepicker-to")).sendKeys("10/27/2017");
            driver.findElement(By.id("datepicker-to")).sendKeys(Keys.ENTER);


            //Explicit wait
            WebDriverWait wait = new WebDriverWait(driver, 300);
            WebElement search = wait.until(ExpectedConditions.visibilityOfElementLocated(By.xpath(".//*[@id=\'fare-search-btn\']")));
            search.click();

            //Search
            //Thread.sleep(3000);
            driver.findElement(By.id("fare-search-btn")).click();

            //driver.quit();
        }

    }

最佳答案

在这种情况下,您需要等待回程日期选择器关闭。回程日期选择器元素是

<table class="ui-datepicker-calendar">...</table>

等待它关闭的代码是等待元素不可见。

new WebDriverWait(driver, 10).until(ExpectedConditions.invisibilityOfElementLocated(By.cssSelector("table.ui-datepicker-calendar")));

您的代码正在等待“搜索”按钮可见。从技术上讲,它已经可见,只是被日期选择器下拉列表覆盖了。 Selenium 中的可见性与不可见(显示:无等)有关,而不是我看不到它,因为它被另一个元素覆盖了。

关于java - 如何使用 Java 处理与 Selenium 自动化中的其他元素重叠的日历?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46413929/

相关文章:

java - itext, Flying Saucer : xhtml to pdf ClassCastException

java - Selenium 2 WebDriver 找不到链接

java - 如何使用 Maven 基于 testng.xml 的测试标签运行测试?

java - 在多个滚动条之间的 iframe 内滚动

java - 如何使用 appium 和 java 向下滚动以单击 Android 中的元素?

"Google search by image"的 Python 脚本

java - "Method undefined for type"错误,适用于上行 - 发生了什么事?

java - 导入org.apache.cxf无法解析Java

java - 我想将扫描仪的整数输入限制在一个范围内

python - 使用输入按钮处理网站上的分页