簡體   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