簡體   English   中英

Selenium:使用C#在RemoteWebDriver中切換選項卡

[英]Selenium: switch tab in RemoteWebDriver with C#

目前,我正在嘗試使用Selenium Grid和RemoteWebDriver在Safari上運行Selenium測試。 這是我的設置:

  • Mac OS Sierra 10.12.6作為運行測試的計算機。
  • 硒服務器3.5.3。
  • Safari 11。
  • C#Selenium WebDriver和Selenium支持(最新版本)。

我在主機操作系統(Windows 10)上使用端口轉發將請求轉發到在虛擬機上運行的Mac。 在Mac上,我具有Selenium Grid集線器,它的運行方式如下:

java -jar selenium-server-standalone-3.5.3.jar -role hub -port 4723

另外,還有一個節點:

java -jar selenium-server-standalone-3.5.3.jar -role node -hub http://10.0.2.15:4723/grid/register

在代碼中,我這樣啟動驅動程序:

SafariOprions options = new SafariOptions();
IWebDriver driver = new RemoteWebDriver(new Uri(hubURL), options.ToCapabilities());

我的測試在當前設置下運行良好。 但是,當單擊屬性為target='_blank'的鏈接時,我開始遇到一些麻煩。 對於在本地運行的其他驅動程序,我可以切換選項卡而沒有任何麻煩:在單擊鏈接之前,先獲取driver.WindowHandles ,然后單擊鏈接,然后再次檢索Window Handles與以前的句柄進行比較。 之后,我使用driver.SwitchTo().Window(newHandle) ,一切正常。

但是,當涉及到RemoteWebDriver(或Apple的SafariDriver,我不能說得更准確)時,即使打開了新選項卡並且我可以看到它,也總是只有一個Window Handle。

我試圖避免使用“ Command + T”作為建議的解決方案之一來切換選項卡,因為我的測試旨在在所有瀏覽器(Chrome,Firefox,Opera,Edge,Safari)上運行,因此無法正常工作。

更新:我已經嘗試通過RemoteWebDriver在Selenium Grid中運行Chrome和其他瀏覽器,我可以說這不是RemoteWebDriver的問題。 接下來,我已經安裝了Mac的Visual Studio,並重寫了幾樣東西來運行沒有Selenium Grid的測試,只需使用以下代碼即可:

//if memory serves, just like this
SafariOptions options = new SafariOptions();
SafariDriver driver = new SafariDriver(options);

但是,不幸的是,這沒有幫助。 驅動程序將我導航到該頁面,單擊鏈接並打開了一個新標簽,但沒有任何切換。 當我檢查driver.WindowHandles我只有一個,盡管有兩個可見的選項卡。 driver.SwitchTo().ActiveElementdriver.SwitchTo().ActiveElement driver.SwitchTo().Frame(hardcoded_frame_name)似乎都無效。 相當長的等待時間(打開鏈接后等待60秒,然后再等待一秒鍾)也無法正常工作。 現在,我認為這確實是一個錯誤,我將嘗試盡快向Apple報告。

但是現在,也許有人對此有不錯的解決方法?

正如我們在評論中討論的那樣,這似乎是一個時間問題。 因此,我們將促使WebDriverWait與尾隨的Browser實例同步。 我正在提供一個代碼塊作為通過Selenium-Java的解決方案,考慮在C#實現它,並在適合您時對其進行更新。

    driver.get("http://www.google.com");
    System.out.println("Page Title is : "+driver.getTitle());
    String parent_window = driver.getWindowHandle();
    ((JavascriptExecutor) driver).executeScript("window.open('http://facebook.com/');");
    WebDriverWait wait = new WebDriverWait(driver,3);
    wait.until(ExpectedConditions.numberOfWindowsToBe(2));
    Set<String> allWindows_1 = driver.getWindowHandles();
    ArrayList<String> tabs = new  ArrayList<>(allWindows_1);
    driver.switchTo().window(tabs.get(1));
    wait.until(ExpectedConditions.titleContains("Facebook"));
    System.out.println("First Child Handle : "+driver.getTitle());

我可以為您提供Java版本的幫助:

完成操作后,請執行以下操作。

//Store the parent window
        String parentWindow = driver.getWindowHandle();

        //Open a new Windows(Mailtrap)
        String a = "window.open('https://mailtrap.io/signin','_blank');";
        ((JavascriptExecutor)driver).executeScript(a);

        //This Thread.sleep is useful with Safari. Do not remove.
        try {
            Thread.sleep(3000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        //Take control over new browser
        for(String handle: driver.getWindowHandles()){
            driver.switchTo().window(handle);
        }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM