Как обрабатывать всплывающие окна fancybox через Selenium WebDriver с использованием Java - PullRequest
1 голос
/ 30 апреля 2019

Я пытаюсь обработать всплывающее окно аутентификации, используя код ниже:

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");

Но я не могу ввести адрес электронной почты в поле проверки электронной почты.Пожалуйста, помогите.

Ответы [ 3 ]

0 голосов
/ 30 апреля 2019

Это не всплывающее окно, это Лайтбокс .

К счастью, с этим действительно легко иметь дело, это просто стандартный HTML внутри стандартного DOM. Решение вашей проблемы:

    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 элемента (на момент написания этого), которые имеют идентификатор, который должен быть уникальным. Это проблема, которую ваши разработчики должны решить, потому что этот 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");

Однако я бы посоветовал вам не делать этого, это действительно нужно исправить!

0 голосов
/ 30 апреля 2019

Всплывающее окно аутентификации , на которое вы ссылаетесь, технически называется fancybox .Чтобы отправить символ sequebce в поле Email , вам нужно вызвать WebDriverWait для elementToBeClickable(), и вы можете использовать следующее решение:

  • Кодовый блок:

    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");
    
  • Снимок браузера:

printvenue

0 голосов
/ 30 апреля 2019

У вас нет окон для переключения, поэтому вам не нужно использовать переключатель.

Ваше всплывающее окно входа в систему прикреплено к основному 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");
...