2016-08-31 106 views
1

請在宣稱我的問題重複之前,閱讀我面臨的問題。有很多提供解決方案如何處理JavaScript窗口的stackoverflow,但我的情況是非常具體的。如何使用selenium和Java處理javascript彈出窗口?

我正在開發基於Web的應用程序的自動化過程。最近,開發團隊推出了一個MODAL(這意味着該窗口出現在整個網頁的頂部,禁用所有元素定位器)的javascript彈出式調查窗口,提示我們的客人是否參加此調查。我並行運行測試(每次2或3個線程)。對於真正的用戶,可以手動與給定頁面進行交互,有幾種選擇如何擺脫窗口:或者單擊「否」按鈕,或者只是單擊頁面上的任何位置。我發現如何使用硒對「否」按鈕點擊的方式,其中driver.findElement(By.xpath(「xpathOfNOButton」)點擊

第一個問題是沒有線索時和在下一次運行測試的時候,這個模式窗口會出現在什麼頁面上,有些情況下模態窗口根本沒有出現,有時候用戶可能只是打開主頁,窗口立刻出現,有時可能需要4- 6分鐘,沒有邏輯開發團隊只提供瞭解釋,這個JavaScript模式窗口將出現在33%的網站訪問者(第三方供應商,沒有內部控制),就是這樣,所以解決方案就像等待一定的時間,然後點擊「否」按鈕將不起作用。沒有步驟存在t可以觸發這個模式窗口彈出(就像其他一些應用程序一樣)。

試圖解決:因爲這只是我們的web應用程序的生產版本發生的事情,我設立了Firefox的配置邏輯,一旦它與WWW啓動。的URL,它將禁用頁面上的所有JavaScript。但是這個解決方案完全打破了所有的頁面,因爲許多其他功能依賴於這些功能。

問題:有沒有什麼辦法在Java或硒檢查給定頁面的整個HTML結構,以確定此模式彈出腳本是否存在於HTML或不是?我知道這可能會增加我的測試時間,因爲我將不得不扼殺其他每一頁。

第二個問題是:有什麼辦法,在頁面的空白區域單擊,而無需指定與硒的webdriver特定元素?如果是的話,模態窗口被捕獲,我可以做這個動作來關閉模態窗口。

+0

據我瞭解這是一個自定義js警報? – unickq

+0

@NickQ你好。不太熟悉自定義和非自定義js Alerts,但這是對應於我頭痛的HTML結構行 GordonFreaman

+0

這個模型窗口是如何創建的?如果這是一個具有特定名稱的DIV元素,您可以在頁面上檢查它們。關於第二個問題,由於這是一個模型窗口,因此它的大小會小於頁面的大小,所以只需點擊頁面角落中幾個pixcel的位置即可。 – lsiva

回答

0

第一個問題Awnser:

是。

當您執行findElement()findElements(),硒將整個文檔你正在試圖 搜索查找。如果findElement()沒有找到任何內容,則拋出異常, 而不是findelements()將返回空列表。這樣,你可以在findelements()中使用一些cssselector或xpath來檢查它是否存在,如果不存在(返回一個空列表),則跳過模態步驟。

第二問題Awnser:

有兩種很好的方法可以做到這一點:你可以在頁面的點(1,1)執行點擊操作,在selenium裏面使用javascript 或jquery代碼隱藏模式,但是如果你有一個模式淡入淡出該 隱藏模式,當你點擊它,肯定是用更好的點擊 硒比JS,只針對modalfade格,然後單擊

0

我們之前遇到過類似的問題。有一個廣告彈出窗口隨機出現在頁面上,我們無法點擊我們想要的按鈕。因此,而不是webDriver.click(),我們做了一個點擊方法。它看起來像;

public void clickTo(WebElement element) { 
    try { 
     element.click(); 
    } catch (WebDriverException ex) { 
     logger.warn("WebDriver exception: ", ex); 
     webDriver.findElement(By.xpath("//*[@id='xlightBox']//span[@class='closeBtn']")).click(); 
     element.click(); 
    } 
+1

你是如何處理彈出窗口的情況下,當webdriver要做其他動作,如從保存箱中選擇一個選項,移動到一個元素,輸入值到一個文本框等 – Grasshopper

+0

@Taylan我相信它會工作只有在點擊命令之間出現彈出窗口時纔會很棒。但有時在我的情況下,當用戶不執行任何點擊(數據輸入到文本框的情況下,用戶驗證某些元素的存在的情況)時,彈出的模態JavaScript窗口會出現。 – GordonFreaman

+0

@Grasshopper我們有其他的方法,然後clickTo()做基本相同的事情。如果我們想向文本框輸入某些東西,我們不使用element.sendKey(),那麼在我們的框架中使用try catch就有了一個type()方法。順便說一句,我沒有寫出我們正在使用的整個方法。捕獲內部,如果塊爲不同類型的彈出窗口。但這個想法是一樣的。 我希望它有助於一些。 –

1

我遇到了類似的情況與我們的網站。 15秒後,會彈出一個模式對話框,並要求客戶註冊一個簡報。問題在於,根據腳本的不同,我可能會在15秒內到達網站的任何地方,然後模式會彈出混亂的腳本執行。我做了一些調查,發現彈出模式的功能是檢查cookie的存在,然後如果它不存在,它會彈出模式。這個想法是,如果客戶被呈現模式並作出選擇,他們不應該再被提示一段時間。那時候,我在開始測試之前找到了cookie並創建了它。當腳本第一次到達站點時,創建模式函數看到cookie存在並且從未創建模式。

我不知道該模式如何在您的網站上工作,但我猜它可能會遵循類似的程序,所以這些信息可能對您有所幫助。創建cookie非常簡單。如果你需要的話,SO和其他地方都有很多關於這個過程的文章。這很大程度上取決於cookie中的信息,但一旦你弄清楚了,代碼就很簡單。

該過程導航到您網站上的某個404頁面,例如, http://www.example.com/abcdefg,創建cookie,然後開始測試。

+0

這正是開發團隊所解釋的。模態窗口應該查找一個cookie,如果存在任何表示用戶已經參與此調查的情況,模態窗口將不會彈出。 – GordonFreaman

+0

太好了。所以dev可以給你關於cookie的信息,你應該能夠在腳本啓動之前創建一個,並完全避免這個問題。 – JeffC

相關問題