【问题标题】:How to check how many windows can be opened from a webpage using Selenium如何使用 Selenium 检查可以从网页打开多少个窗口
【发布时间】:2019-06-28 00:36:47
【问题描述】:

当网页上已经打开了单个/多个窗口时,我们可以通过使用 selenium 来找出已经打开的窗口数量。但是有没有办法通过任何标签或任何其他方式找出使用 selenium 在给定网页上实际可以打开多少个窗口。

例如,我们对网页上的所有 URL 都有一个锚标记,那么有什么方法可以找出网页上可以打开多少个窗口或单击多少个按钮/链接,一个窗口将被打开。

任何 java 或 python 以及任何网页的解决方案将不胜感激。

【问题讨论】:

    标签: java python selenium selenium-webdriver window-handles


    【解决方案1】:

    直接回答,事实上没有明确的方法可以计算使用 Selenium 从网页可以打开多少(子)窗口

    <a>: 锚元素

    HTML <a> element(或 anchor 元素)定义了一个超链接,用于从一个页面链接到其他网页、文件、同一页面内的位置、电子邮件地址或任何其他 URL . <a> 元素最重要的属性是 href 属性,它指示链接的目的地。 target 属性只能与锚标签中的 href 属性一起使用,方法如下:

    • 如果未使用目标属性,则链接将在同一页面中打开。

      • 一个例子:

        <a href="https://www.w3schools.com">Visit W3Schools.com!</a>
        
    • 如果目标属性设置为_blank,链接将在新的浏览器窗口或新标签页中打开。

      • 一个例子:

        <!DOCTYPE html>  
        <html>  
            <head>  
                <title></title>  
            </head>  
            <body>  
                <p>Click on <a href="https://www.javatpoint.com/" target="_blank"> this-link </a>to go on home page of JavaTpoint.</p>  
            </body>  
        </html> 
        

    现在您可以通过HTML Tag 触发新 TAB/Windows 的打开,除非测试环境内存方面拥有充足的资源,共享内存等。可以在unknown error: session deleted because of page crash from unknown error: cannot determine loading status from tab crashed with ChromeDriver Selenium找到相关讨论

    注意:一个重要方面是,如果您正在打开一个新的 TAB/Window 并打算将 Selenium 的焦点切换到新打开的 TAB/Window,则需要诱导WebDriverWait如下:

    • Java 示例)ExpectedConditions as numberOfWindowsToBe(int expectedNumberOfWindows):

      new WebDriverWait(driver,10).until(ExpectedConditions.numberOfWindowsToBe(2));
      
    • Python 示例)expected_conditions as number_of_windows_to_be(num_windows):

      WebDriverWait(driver, 10).until(expected_conditions.number_of_windows_to_be(2))
      

    【讨论】:

    • 感谢 Debanjan 分享您对此的宝贵见解,我对其中的大部分内容都很熟悉。窗口编号问题只是出于好奇,这在硒中也是可能的,因为我和我的团队在午餐时间讨论了一些事情并且出现了这个问题,所以我想我应该在 stackoverflow 上询问是否可能,哪个现在看来是不可能的,但再次感谢您分享您的见解。
    【解决方案2】:

    是的,根据锚标记,您可以找到可以从页面打开多少个链接,并且可以在“n”个窗口中打开一个链接,因此在窗口中打开链接后,您可以获得打开的窗口数,试试下面的代码:

    import java.util.List;
    import org.openqa.selenium.By;
    import org.openqa.selenium.Keys;
    import org.openqa.selenium.WebDriver;
    import org.openqa.selenium.WebElement;
    import org.openqa.selenium.chrome.ChromeDriver;
    
    public class Testing {
        public static void main(String ...ali) {
            System.setProperty("webdriver.chrome.driver", "C:\\NotBackedUp\\chromedriver.exe");
            WebDriver driver = new ChromeDriver();
            driver.get("http://www.google.com");
            driver.findElement(By.name("q")).sendKeys("alicse3"+Keys.ENTER);
    
            List<WebElement> links = driver.findElements(By.xpath("//a"));
            int nonEmptyLinks = 0;
            for(WebElement element : links) {
                String link = element.getText().trim();
                if(!link.isEmpty()) {
                    System.out.println(element.getText());
                    nonEmptyLinks++;
                }
            }
            System.out.println("=> The total links is/are '"+nonEmptyLinks+"', so you can open '"+nonEmptyLinks+"' windows using anchor tag...");
        }
    }
    

    上面的代码会计算有多少'href'存在,但不能告诉你可以打开多少个窗口,因为你可以打开'n'个窗口。通过使用下面的代码,您可以找到打开的窗口数:

    Set<String> windows = driver.getWindowHandles();
    System.out.println("=> The total windows opened is/are : "+windows.size());
    

    【讨论】:

    • 谢谢,但我的问题不是可以打开多少个链接,而是网页上可以打开多少个窗口。
    • 您可以打开'n'个窗口
    • 如果你想要打开窗口的数量,那么你可以使用窗口句柄
    • 谢谢阿里,但我已经提到我知道如何找到现在网页上已经打开了许多窗口,我想知道在该页面上可以打开多少个窗口或单击多少个链接,将在该页面上打开一个窗口。
    • 你能给我看一些网页的例子,这样我就可以尝试回答你的问题了
    【解决方案3】:

    我得到了你的问题,基本上你想检查一个网页可以打开多少个窗口。

    为了做到这一点,您可以使用下面的 xpath 来计算将在当前网页上打开的网页数

    //a[@target="_blank"]
    

    您可以使用如下代码:

    import java.util.List;
    import java.util.concurrent.TimeUnit;
    
    import org.openqa.selenium.By;
    import org.openqa.selenium.WebDriver;
    import org.openqa.selenium.WebElement;
    import org.openqa.selenium.chrome.ChromeDriver;
    import org.testng.annotations.Test;
    
    public class Testing {
    	public static WebDriver driver;
    
    	@Test
    	public void test() throws InterruptedException {
    		
    		
    		
    		System.setProperty("webdriver.chrome.driver", "./Driver/chromedriver");
    		driver = new ChromeDriver();
    		driver.get("https://stackoverflow.com");
    		driver.manage().window().maximize();
    		driver.manage().timeouts().implicitlyWait(45, TimeUnit.SECONDS);
    		Thread.sleep(1000);
    		List<WebElement> elements = driver.findElements(By.xpath("//a[@target=\"_blank\"]"));
    		int count =0;
    		for ( WebElement element:elements) 
    		{
    			count++;
    		
    		}
    		System.out.println("Total number of window will be opened by this webpage is:"+ count); 
    	}
    }

    【讨论】:

    • 我对您的代码有疑问,您正在循环打印所有内容,因此会有多个输出,而不仅仅是一个。虽然我已经在grofers.com 上尝试过你的代码,但我得到了 16 行,输出类似于 (1200, 30) 和 (53, 16).....
    • 我已经更新了代码 sn-p。您可以尝试上面的代码。它会给你你正在寻找的结果。
    • 已经在 grofers.com 上尝试过 xpath,它会找到在新选项卡上打开的元素,例如 twitter、facebook 的共享按钮。但我想要的是检查可以在页面上打开的窗口数量,就像点击我的帐户然后点击登录按钮后一样。
    猜你喜欢
    • 1970-01-01
    • 2023-03-06
    • 2017-12-29
    • 1970-01-01
    • 1970-01-01
    • 2023-03-25
    • 1970-01-01
    • 2020-01-25
    • 1970-01-01
    相关资源
    最近更新 更多