【问题标题】:How to handle fancybox popup through Selenium WebDriver using Java如何使用 Java 通过 Selenium WebDriver 处理花式框弹出窗口
【发布时间】:2019-09-19 02:26:59
【问题描述】:

我正在尝试使用以下代码处理身份验证弹出窗口:

driver.get("https://www.printvenue.com");
System.out.println("Successfully opened the Printvenue");
driver.manage().window().maximize();
driver.findElement(By.id("login_li")).click();
Thread.sleep(2000);
Set <String> handles =driver.getWindowHandles();
Iterator<String> it = handles.iterator();
String parent = it.next();
String child = it.next();
driver.switchTo().window(child);
driver.findElement(By.id("email")).sendKeys("abcd@gmail.com");

但我无法在电子邮件测试框中输入电子邮件。 请帮忙。

【问题讨论】:

    标签: java selenium-webdriver css-selectors fancybox webdriverwait


    【解决方案1】:

    您没有可以切换到的窗口,因此您不需要使用开关。

    您的登录弹出窗口附加到主 DOM,因此您可以直接在其中写入。 因为您的元素根本不是唯一的,所以您必须使用 findElements 方法。

    我已经在 Firefox 中测试了以下代码并且可以正常工作:

    driver.get("https://www.printvenue.com");
    System.out.println("Successfully opened the Printvenue");
    driver.manage().window().maximize();
    driver.findElement(By.id("login_li")).click();
    Thread.sleep(2000);
    List<WebElement> emailElement = driver.findElements(By.id("email"));
    System.out.println(emailElement.size()); // this will tell you how many elements with this ID you have in your DOM
    emailElement.get(3).sendKeys("abcd@gmail.com");
    

    【讨论】:

      【解决方案2】:

      您所指的身份验证弹出窗口在技术上称为fancybox。要在 Email 字段中发送 字符序列,您需要为 elementToBeClickable() 诱导 WebDriverWait,您可以使用以下解决方案:

      • 代码块:

        System.setProperty("webdriver.chrome.driver", "C:\\Utility\\BrowserDrivers\\chromedriver.exe");
        ChromeOptions chromeOptions = new ChromeOptions();
        chromeOptions.addArguments("start-maximized");
        //chromeOptions.addArguments("disable-infobars");
        chromeOptions.addArguments("--disable-extensions"); 
        WebDriver driver = new ChromeDriver(chromeOptions); 
        driver.get("https://www.printvenue.com/");
        new WebDriverWait(driver, 20).until(ExpectedConditions.elementToBeClickable(By.partialLinkText("Login"))).click();
        new WebDriverWait(driver, 20).until(ExpectedConditions.elementToBeClickable(By.cssSelector("div.fancybox-outer input[id='email']"))).sendKeys("abcd@gmail.com");
        
      • 浏览器快照:

      【讨论】:

        【解决方案3】:

        这不是弹出窗口,而是Lightbox

        谢天谢地,这使它非常容易处理,它只是标准 DOM 中的标准 HTML。您的问题的解决方案是:

            WebDriverWait wait = new WebDriverWait(driver, 15, 100);
            driver.get("https://www.printvenue.com");
        
            System.out.println("Successfully opened the Printvenue");
        
            wait.until(ExpectedConditions.visibilityOfElementLocated(By.id("login_li"))).click();
            WebElement emailElement = wait.until(ExpectedConditions.visibilityOfElementLocated(By.id("email")));
            emailElement.sendKeys("abcd@gmail.com");
        

        好吧,无论如何,这应该是您问题的解决方案。您在这里看到的真正问题是页面上有 4 个元素(在撰写本文时)共享一个应该是唯一的 ID。这是您的开发人员需要解决的问题,因为此 HTML 不符合 W3C!我会把它作为一个错误提出来并让他们修复它。

        您可以使用如下代码解决此问题:

            List<WebElement> emailElements = driver.findElements(By.id("email"));
            System.out.println(String.format("Oh dear, there are %s instances of the id email when there should only be 1...", emailElements.size()));
            emailElements.get(3).sendKeys("abcd@gmail.com");
        

        但是我建议你不要这样做,这是真正需要解决的问题!

        【讨论】:

        • 如果您发现任何有用的回复,请点赞。如果其中一个答案解决了您的问题,请选择它作为解决方案。
        猜你喜欢
        • 2015-07-09
        • 2013-10-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-06-29
        • 2012-07-16
        • 1970-01-01
        相关资源
        最近更新 更多