繁体   English   中英

如何使用 Serenity BDD 管理浏览器选项卡?

[英]How to manage browser tabs with Serenity BDD?

如何使用 Serenity BDD 管理一个浏览器选项卡或多个浏览器 windows?

例如,我正在测试的站点中有一个链接可以在不同的目标中打开一个页面,这意味着它会在一个新的浏览器选项卡中打开。 我的 Serenity 测试无法在新页面上找到简单的 header(位于 xpath“//h3”),我能想到的唯一原因是它仍在查看原始浏览器选项卡。 所以我需要在做出断言之前以某种方式切换选项卡。

我知道我可以在 web 驱动程序级别切换浏览器选项卡。 但是因为我不能直接从演员那里得到驱动程序,go 关于访问演员正在使用的驱动程序的最佳方法是什么? 是的,我正在向演员提供该驱动程序,因此可以保留对它的引用,但由于我在同一测试中使用多个不同的演员(来宾用户导致只有管理员用户才能验证的更改)我会使它比某处简单的 web 驱动程序参考更复杂。

所以我的问题再次是:是否有一种很好的方法来管理内置在 Serenity BDD 或剧本模式中的演员浏览器中的选项卡?

您可以创建一个交互类来切换选项卡,并在交互类中直接使用actor的驱动程序,例如

public class SwitchToNewWindow implements Task {

    private static final Logger log = LoggerFactory.getLogger(SwitchToNewWindow.class);

    public SwitchToNewWindow() { }

    @Override
    public <T extends Actor> void performAs(T actor) {
        
        WebDriver driver = BrowseTheWeb.as(actor).getDriver();
        
        String currHandle = driver.getWindowHandle();
        Set<String> allHandles = driver.getWindowHandles();
        
        log.debug("open windows: " + allHandles.size());
        log.debug("current window: " + currHandle);
        for (String handle : allHandles) {
            if (!handle.contentEquals(currHandle)) {
                driver.switchTo().window(handle);
                break;
            }
        }
        log.debug("new window: " + driver.getWindowHandle());
    }

    public static SwitchToNewWindow change() {

        return Tasks.instrumented(SwitchToNewWindow.class);
    }
}
public class SwitchToNewWindow implements Task{
    public SwitchToNewWindow (){}
    
    public static SwitchToNewWindow switchToNewTab(){
       return Instrumented.instanceOf(SwitchToNewWindow.class).withProperties();
    }

@Step("{0} Switching to new Window")
    public <T extends Actor> void performAs(T actor) {
       String currentWindow = getDriver().getWindowHandle();
       Set<String> allWindows = getDriver().getWindowHandles();
       for(String window : allWindows){
         if(!window.contentEquels(currentWindow){
            getDriver().switchTo().window(window);
            break;
         }
       }
    }
}

在您的步骤定义中

actor.attemptsTo(SwitchToNewWindow.switchToNewTab());
        actor.attemptsTo(Switch.toNewWindow());

如果它已经打开,则切换到新标签

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM