Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/selenium/4.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 在Firefox中打开新选项卡,并且使用Selenium的Chrome不起作用_Java_Selenium_Google Chrome_Firefox - Fatal编程技术网

Java 在Firefox中打开新选项卡,并且使用Selenium的Chrome不起作用

Java 在Firefox中打开新选项卡,并且使用Selenium的Chrome不起作用,java,selenium,google-chrome,firefox,Java,Selenium,Google Chrome,Firefox,我读了很多关于如何使用Selenium打开新窗口的选项。所有的问题和答案都是几年前的,也许这就是为什么他们不适合我。这就是为什么我想再次提出这个问题 我的第一种方法是使用javascript操作: ((JavascriptExecutor) getDriver()).executeScript("window.open('','NewWindow');"); 我这里的问题是Firefox和Chrome的不同结果。Firefox将打开一个新窗口,Chrome将打开一个新选项卡。这意味着,如果我在

我读了很多关于如何使用Selenium打开新窗口的选项。所有的问题和答案都是几年前的,也许这就是为什么他们不适合我。这就是为什么我想再次提出这个问题

我的第一种方法是使用javascript操作:

((JavascriptExecutor) getDriver()).executeScript("window.open('','NewWindow');");
我这里的问题是Firefox和Chrome的不同结果。Firefox将打开一个新窗口,Chrome将打开一个新选项卡。这意味着,如果我在不同的浏览器中执行测试,我的测试用例将无法按预期工作

在那之后,我想到了另一种方法。如果我发送快捷方式来打开一个新选项卡,可能两个浏览器的行为都相同。我的噩梦就这样开始了。下一个选项都不会在当前的Chrome和Firefox版本中打开任何内容:

  • 发送键连接快捷方式:
    getDriver().findElement(By.xpath(".//body")).sendKeys(Keys.COMMAND+"T");
    
  • 按多个键顺序发送键:
    getDriver().findElement(By.xpath(".//body")).sendKeys(Keys.COMMAND,"T");
    
  • 发送键和弦
    getDriver().findElement(By.xpath(".//body")).sendKeys(Keys.chord(Keys.COMMAND + "T"));
    
  • 使用动作
    final Actions builder = new Actions(getDriver());
    builder.keyDown(Keys.COMMAND).sendKeys("T").perform();
    
  • 我正在考虑尝试用命令键向下点击任何链接,但也许还有一种简单的方法可以在不同的浏览器中打开一个新的选项卡。这就是我的问题,你现在有没有一种有效的方法可以在不同的浏览器中用相同的动作打开一个新的标签,而不是一个新的窗口

    传统信息

    Selenium版本->3.141.59

    Chrome版本->79.0.3945.79

    Firefox版本->70.0.1

    提前谢谢。

    这可能会对您有所帮助:-

    使用JavascriptExecutor:-

    • 打开新的空白窗口:-
    ((JavascriptExecutor)驱动程序).executeScript(“window.open('about:blank','u blank');”

    • 使用特定url打开新窗口:
    ((JavascriptExecutor)驱动程序).executeScript(“window.open('http://www.yahoo.com“,”空白“;”

    使用机器人类:-

    Selenium中的Robot类用于模拟键盘和鼠标事件。因此,为了打开一个新选项卡,我们可以模拟按下
    控制键
    ,然后按下键盘的
    't'
    键的键盘事件。打开新选项卡后,我们需要将焦点切换到它,否则驱动程序将仅尝试在父选项卡上执行操作。 对于切换焦点,我们将使用
    getWindowHandles()
    获取新选项卡的句柄,然后将焦点切换到它

    //Use robot class to press Ctrl+t keys     
    Robot robot = new Robot();                          
    robot.keyPress(KeyEvent.VK_CONTROL); 
    robot.keyPress(KeyEvent.VK_T); 
    robot.keyRelease(KeyEvent.VK_CONTROL); 
    robot.keyRelease(KeyEvent.VK_T);
    
    //Implicit Wait
    //driver.manage().timeouts().implicitlyWait(10,TimeUnit.SECONDS) ;
    Thread.sleep(2000);
    
    //Switch focus to new tab
    ArrayList<String> tabs = new ArrayList<String> (driver.getWindowHandles());
    driver.switchTo().window(tabs.get(1));
    
    //Launch URL in the new tab
    driver.get("http://google.com");*/
    
    //使用robot类按Ctrl+t键
    机器人=新机器人();
    机器人按键(KeyEvent.VK_控制);
    robot.keyPress(KeyEvent.VK_T);
    robot.keyRelease(KeyEvent.VK_控制);
    robot.keyrease(KeyEvent.VK_T);
    //隐式等待
    //driver.manage().timeouts().implicitlyWait(10,TimeUnit.SECONDS);
    《睡眠》(2000年);
    //将焦点切换到新选项卡
    ArrayList tabs=新的ArrayList(driver.getWindowHandles());
    driver.switchTo().window(tabs.get(1));
    //在新选项卡中启动URL
    驱动程序。获取(“http://google.com");*/
    
    机器人类使用selenium在新选项卡中打开url的两种方法

    public class NewTab 
    {
    
        public static void main(String[] args) throws InterruptedException, AWTException {
            WebDriver driver =  new FirefoxDriver();
            driver.get("http://www.facebook.com/"); 
    
            Robot r = new Robot();
            r.keyPress(KeyEvent.VK_CONTROL); 
            r.keyPress(KeyEvent.VK_T); 
            r.keyRelease(KeyEvent.VK_CONTROL); 
            r.keyRelease(KeyEvent.VK_T);
    
            Set<String> tabs = (Set<String>)driver.getWindowHandles();
    
            for(String tab : tabs)
            {
                driver.switchTo().window(tab);
                System.out.println(driver.getTitle());
                if(driver.getTitle().contains("New Tab"))
                    driver.get("http://www.google.com/");
            }
        }
    }
    
    公共类NewTab
    {
    公共静态void main(字符串[]args)抛出InterruptedException、AWTException{
    WebDriver=newfirefoxdriver();
    驱动程序。获取(“http://www.facebook.com/"); 
    机器人r=新机器人();
    r、 按键(KeyEvent.VK_控件);
    r、 按键(KeyEvent.VK_T);
    r、 keyRelease(KeyEvent.VK_控件);
    r、 密钥释放(KeyEvent.VK_T);
    Set tabs=(Set)driver.getWindowHandles();
    用于(字符串选项卡:选项卡)
    {
    driver.switchTo()窗口(选项卡);
    System.out.println(driver.getTitle());
    if(driver.getTitle()包含(“新选项卡”))
    驱动程序。获取(“http://www.google.com/");
    }
    }
    }
    
    另一种方法,不使用for循环

    public class NewTab {
    
        public static void main(String[] args) throws InterruptedException, AWTException {
            WebDriver driver =  new FirefoxDriver();
            driver.get("http://www.google.com/");   
    
            Robot r = new Robot();
            r.keyPress(KeyEvent.VK_CONTROL); 
            r.keyPress(KeyEvent.VK_T); 
            r.keyRelease(KeyEvent.VK_CONTROL); 
            r.keyRelease(KeyEvent.VK_T);
    
            String Base = driver.getWindowHandle();
                    Set<String> tabs = (Set<String>)driver.getWindowHandles();
    
                    tabs.remove(Base);
                    driver.switchTo().window(tabs.toArray()[0].toString());
                    driver.get("http://www.facebook.com/");
        }
    }
    
    公共类NewTab{
    公共静态void main(字符串[]args)抛出InterruptedException、AWTException{
    WebDriver=newfirefoxdriver();
    驱动程序。获取(“http://www.google.com/");   
    机器人r=新机器人();
    r、 按键(KeyEvent.VK_控件);
    r、 按键(KeyEvent.VK_T);
    r、 keyRelease(KeyEvent.VK_控件);
    r、 密钥释放(KeyEvent.VK_T);
    String Base=driver.getWindowHandle();
    Set tabs=(Set)driver.getWindowHandles();
    拆下(底座);
    driver.switchTo().window(tabs.toArray()[0].toString());
    驱动程序。获取(“http://www.facebook.com/");
    }
    }
    
    请尝试下面的代码。 我没有使用javascript

    String selectLinkOpeninNewTab = Keys.chord(Keys.CONTROL,"t");
    driver.findElement(By.linkText("urlLink")).sendKeys(selectLinkOpeninNewTab);
    

    当一位用户问我最终如何解决这个问题时,我的解决方案是:

    // Save the current window reference
    final String parentWindow = driver.getWindowHandle();
    // Look for the element I would like to click
    final WebElement elem = driver.findElement(By.xpath(xpath));
    // Create an action to be performed
    final Actions builder = new Actions(driver);
    // The OSKEY is a global variable where depending on the OS is saved CMD or CTR
    // With the special key chord, the program clicks on the element
    builder.keyDown(OSKEY).click(elem).perform();
    

    对我来说,它可以在没有浏览器问题的情况下工作。

    executeScript(“window.open(“'NewWindow');”)
    打开一个带有
    geckodriver 0.26.0
    Firefox 71.0
    的新选项卡。感谢您的回答,但您的第一个选项是我的第一个选项,它无法工作,就像我前面提到的一样。你的第二个选项我已经试过了,但是我没有找到命令(MAC)键。我先测试了,然后放在这里。它在我的两个浏览器中都可以正常工作。@j.barrio请参考此链接,我已经成功地使用了您的
    “window.open”()http://www.yahoo.com“,”空白“;”
    方法。