2017-09-14 97 views
1

目前,我正在運行使用硒網格和RemoteWebDriver在Safari上我的Selenium測試。這是我的設置:硒:在RemoteWebDriver開關選項卡用C#

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

我在我的主機操作系統(Windows 10)上使用端口轉發將請求轉發到運行在我的虛擬機上的Mac。在我的Mac我有硒電網樞紐,它在我奔跑像這樣:

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,然後單擊一個鏈接並再次檢索窗口句柄以與以前的句柄進行比較。之後,我使用driver.SwitchTo().Window(newHandle),一切都很好。

但是當涉及到RemoteWebDriver(或Apple的SafariDriver,我不能更準確地說)我總是隻能獲得一個窗口句柄,即使打開新選項卡並且我可以看到它。我試圖避免切換選項卡與「Command + T」作爲解決方案之一建議,因爲我的測試是爲了在所有瀏覽器(鉻,火狐,歌劇,邊緣,Safari)上運行,這不會工作。

更新:我試過在Selenium Grid中通過RemoteWebDriver運行Chrome和其他瀏覽器,我可以說這不是RemoteWebDriver的問題。接下來,我已經安裝了Visual Studio的Mac和重寫幾件事情來運行我的測試,而硒電網,只需使用此代碼:

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

但不幸的是,這並沒有幫助。司機導航我到頁面,點擊鏈接並打開一個新標籤,但沒有任何開關。當我檢查driver.WindowHandles我只有一個,雖然有兩個可見的選項卡。 driver.SwitchTo().ActiveElementdriver.SwitchTo().Frame(hardcoded_frame_name)都不起作用。相當長的等待時間(在打開鏈接之後60秒以及之後的另一個鏈接)都不起作用。現在我認爲這確實是一個錯誤,我會盡快向蘋果公司報告。

但現在,也許有人有這樣一個奇特的解決方法嗎?

+0

可能與Safaridriver的錯誤太不檢測新窗口 –

+0

你能提供一些等待(WebDriverWait),並重新檢查? – DebanjanB

+0

@DebanjanB,是的,我提供了幾項長期支票,並且徒勞無功。 我已經在網格上檢查了RemoteWebDriver與其他瀏覽器,一切都很好。所以我認爲這個問題與我啓動Selenium Grid和Safari的方式有關。因爲使用nodeconfig.json,我根本沒有得到任何句柄。將嘗試直接在Mac上運行測試併發布任何更新。 –

回答

0

正如我們在評論中討論,這似乎是一個時間問題。所以我們會誘導 WebDriverWait與尾隨的瀏覽器實例同步。我通過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()); 
+0

對不起另一個遲到的迴應,但正如我在帖子中說的 - 我已經用等待沒有效果。實際上,有很多人等待時間很長(我試過10,30,60秒)。從我的角度來看,這是關於SafariDriver的。或者,如果您的解決方案像Safari + Java的魅力一樣工作,那麼我認爲它與.Net綁定有關,因爲它們與Java相比有點過時。 –