2014-12-03 116 views
1

使用硒webdriver截取頁面時,會彈出一個「彈出窗口」。關閉硒中的通用彈出框

在打開頁面時,http://www.fanatics.com/search/red%20shoes - 我看到一個彈出窗口,其中包含xpath'// * [@ id =「mm_DesktopInterstitialImage」]' - 但我不想使用xpath關閉此警報,一些可以消除/關閉警報的genric。 這是我試過到目前爲止 - :

from selenium import webdriver 
import os 
from selenium.webdriver.common.desired_capabilities import DesiredCapabilities 

chromedriver = "/usr/local/CHROMEDRIVER" 
desired_capabilities=DesiredCapabilities.CHROME 
os.environ["webdriver.chrome.driver"] = chromedriver 
driver = webdriver.Chrome(chromedriver,desired_capabilities=desired_capabilities) 
url='http://www.fanatics.com/search/red%20shoes' 
driver.get(url) 
#driver.set_page_load_timeout(300) 
driver.implicitly_wait(60) 
alert = driver.switch_to_alert() 
alert.dismiss 
handle=driver.window_handles 
print handle 
#[u'CDwindow-B1E9C127-719D-ACAA-19DE-1A6FA265A4FF'] 

從我從相關實例理解,鄉親們平時切換窗口句柄,但我的手柄有一個單一的element.ie,driver.switch_to_window(driver.window_handles[1])然後driver.close()最後再轉向使用driver.switch_to_window(driver.window_handles[1])我還使用了隱式等待,因爲我不確定,如果警報窗口正在被讀取 - 但這也不起作用。如果可能的話,我不會對xpath進行硬編碼。

我在做什麼錯?

相關,但對我開不工作:Selenium python how to close a pop up window?

+1

路易是絕對正確的,它不是可以使用開關來警告處理一個警告窗口。所以你需要使用關閉按鈕關閉彈出的div。 – 2014-12-03 11:47:51

回答

1

正如我所見,它不是一個警告框!。它只是一個簡單的彈出窗口,當您進入該頁面時出現,並且它出現在主窗口本身中(無需切換並關閉它))。使用下面的代碼關閉它。

driver.find_element_by_xpath('//div[contains(@class,"ui-dialog") and @aria-describedby="dialogContent2"]//button[@title="Close"]').click() 
+0

你還可以描述你如何構建特定的xpath?在通常使用inspect元素然後複製xpath - 但我得到了不同的xpath。此外,我過去使用過xpath checker,但它並不適用於所有情況。 – ekta 2014-12-03 12:14:09

+0

上面是一個** [相對xpath](http://www.tizag.com/xmlTutorial/xpathrelative.php)**,與**絕對xpath **不同,我們(有時)使用**「Firepath」在Firebug **。它用於創建一致的xpath,並且從長遠來看最有可能是有效的。你可以看到這個鏈接,它會幫助你創建你自己的相對xpath: -selenium最羅塞塔石/(https://www.simple-talk.com/dotnet/.net-framework/xpath,-css,-dom-and-selenium-the-rosetta-stone/) – Subh 2014-12-03 12:53:50

1

你試圖關閉彈出是不是瀏覽器警報,但一DOM彈出。瀏覽器警報是瀏覽器在操作系統級別創建的對話框。 (它在桌面上顯示爲一個附加窗口。)您可以使用.switch_to_alert()關閉這些警報。 DOM彈出窗口僅僅是一個HTML元素,它恰好被用作頁面,就像它是一個對話框一樣。此彈出窗口只在您的瀏覽器中存在。 (操作系統不知道。)您不能使用.switch_to_alert()關閉DOM彈出窗口。

爲了得到這個彈出框並關閉它,你必須檢查DOM(就像你已經開始做的那樣),找到表示關閉按鈕的DOM元素並讓Selenium單擊它。

0

我遇到了類似的問題,除了我們的彈出窗口的closebox webelement有一個動態的id標記,因此很難鎖定。我們最終通過使用By.className來找到它來解決它。在下面的代碼中,我使用了List,因爲我也在查看我正在處理的元素數量,但這不是必需的。此外,生產代碼還有額外的處理,以查找窗口closebox元素。

List<WebElement> closeboxes = driver.findElements(By.className("v-window-closebox")); 
for (WebElement we : closeboxes) { 
    we.click(); 
} 
0

它完美,不妨一試;)

from selenium import webdriver 
from selenium.webdriver.chrome.options import Options 

options = Options() 
options.add_argument("--disable-notifications") 
browser = webdriver.Chrome('C:\Python34\Lib\site-packages\selenium\webdriver\chromedriver.exe', chrome_options=options)