Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/385.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用Java通过SeleniumWebDriver处理fancybox弹出窗口_Java_Selenium Webdriver_Css Selectors_Fancybox_Webdriverwait - Fatal编程技术网

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

如何使用Java通过SeleniumWebDriver处理fancybox弹出窗口,java,selenium-webdriver,css-selectors,fancybox,webdriverwait,Java,Selenium Webdriver,Css Selectors,Fancybox,Webdriverwait,我正在尝试使用以下代码处理身份验证弹出窗口: 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> hand

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

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");
driver.get(“https://www.printvenue.com");
System.out.println(“已成功打开打印场地”);
driver.manage().window().maximize();
driver.findElement(By.id(“login_li”))。单击();
《睡眠》(2000年);
Set handles=driver.getWindowHandles();
迭代器it=handles.Iterator();
字符串parent=it.next();
String child=it.next();
driver.switchTo().窗口(子窗口);
driver.findElement(By.id(“电子邮件”)).sendKeys(“abcd@gmail.com");
但我无法在电子邮件测试框中输入电子邮件。
请帮助。

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

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

我在Firefox和works中测试了以下代码:

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");
driver.get(“https://www.printvenue.com");
System.out.println(“已成功打开打印场地”);
driver.manage().window().maximize();
driver.findElement(By.id(“login_li”))。单击();
《睡眠》(2000年);
List emailElement=driver.findElements(By.id(“电子邮件”));
System.out.println(emailElement.size());//这将告诉您DOM中有多少个元素具有此ID
emailElement.get(3).sendKeys(“abcd@gmail.com");

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

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

我在Firefox和works中测试了以下代码:

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");
driver.get(“https://www.printvenue.com");
System.out.println(“已成功打开打印场地”);
driver.manage().window().maximize();
driver.findElement(By.id(“login_li”))。单击();
《睡眠》(2000年);
List emailElement=driver.findElements(By.id(“电子邮件”));
System.out.println(emailElement.size());//这将告诉您DOM中有多少个元素具有此ID
emailElement.get(3).sendKeys(“abcd@gmail.com");

这不是弹出窗口,而是一个窗口

谢天谢地,这使它非常容易处理,它只是标准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!我会把它当作一个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("abcd@gmail.com");
List emailElements=driver.findElements(By.id(“email”);
System.out.println(String.format(“哦,天哪,应该只有1个id电子邮件的实例是%s…”,emailElements.size());
emailElements.get(3).sendKeys(“abcd@gmail.com");

但是我会鼓励你不要这样做,这是一个真正需要解决的问题

这不是弹出窗口,而是一个窗口

谢天谢地,这使它非常容易处理,它只是标准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!我会把它当作一个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("abcd@gmail.com");
List emailElements=driver.findElements(By.id(“email”);
System.out.println(String.format(“哦,天哪,应该只有1个id电子邮件的实例是%s…”,emailElements.size());
emailElements.get(3).sendKeys(“abcd@gmail.com");
但是我会鼓励你不要这样做,这是一个真正需要解决的问题

您所指的身份验证弹出窗口在技术上称为fancybox。要在Email字段中发送字符序列,您需要为
元素导入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");
    
  • 浏览器快照:

您所指的身份验证弹出窗口在技术上称为fancybox。要在Email字段中发送字符序列,您需要为
元素导入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");
    
  • 浏览器快照:


如果您发现任何回复都很有用,请将其更新投票。如果其中一个答案解决了您的问题,请选择它作为解决方案。如果您发现任何答案都有用,请投票表决。如果其中一个答案解决了您的问题,请选择它作为解决方案。