如何使用Java通过Selenium WebDriver处理fancybox弹出窗口

问题描述 投票:1回答:3

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

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("[email protected]");

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

java selenium-webdriver css-selectors fancybox webdriverwait
3个回答
0
投票

这不是一个弹出窗口,它是一个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("[email protected]");

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

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

    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("[email protected]");

但是我鼓励你不要这样做,这是真正需要修复的东西!


0
投票

您引用的身份验证弹出窗口在技术上称为fancybox。要在电子邮件字段中发送字符后遗症,您需要为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("[email protected]");
  • 浏览器快照:

printvenue


0
投票

你没有窗户可以切换到,所以你不需要使用开关。

您的登录弹出窗口附加到主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("[email protected]");
© www.soinside.com 2019 - 2024. All rights reserved.