0

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

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

我知道我可以在 Web 驱动程序级别切换浏览器选项卡。但是由于我无法直接从演员那里获取驱动程序,那么访问演员正在使用的驱动程序的最佳方法是什么?是的,我将该驱动程序提供给参与者,因此可以保留对它的引用,但由于我在同一个测试中使用了多个不同的参与者(来宾用户导致只有管理员用户可以验证的更改)我有使它比某个地方的简单 Web 驱动程序引用更复杂一些。

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

4

2 回答 2

0

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

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);
    }
}
于 2018-09-05T10:58:24.283 回答
0
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());
于 2021-09-02T22:47:06.260 回答