关闭Selenium中的通用弹出窗口

时间:2014-12-03 11:16:34

标签: python selenium selenium-webdriver webdriver popupwindow

使用selenium 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']

根据我从相关示例中的理解,人们通常会切换窗口句柄,但我的句柄只有一个元素。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?

4 个答案:

答案 0 :(得分:2)

我可以看到,它不是一个警示框!! 。它只是一个简单的弹出窗口,当你进入页面时出现,它出现在主窗口本身(不需要切换和关闭它)。使用以下代码将其关闭。

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

答案 1 :(得分:2)

效果很好,试一试;)

...
mongoc_bulk_operation_t* pBulk = mongoc_collection_create_bulk_operation(coll_,false,NULL); //unorderd

mongoc_bulk_operation_update_one(pBulk,&query1,&document,false);
mongoc_bulk_operation_update_one(pBulk,&query2,&document,false);
mongoc_bulk_operation_update_one(pBulk,&query3,&document,false);
mongoc_bulk_operation_update_one(pBulk,&query4,&document,false);
mongoc_bulk_operation_update_one(pBulk,&query5,&document,false);
mongoc_bulk_operation_update_one(pBulk,&query6,&document,false);

bson_t reply;
bson_error_t error;
uint32_t ret = mongoc_bulk_operation_execute(pBulk,&reply,&error);

if (ret) {
    str = bson_as_canonical_extended_json (&reply, NULL);
    printf ("%s\n", str);
    bson_free (str);
}

答案 2 :(得分:1)

您尝试关闭的弹出窗口不是浏览器警报,而是 DOM 弹出窗口。浏览器警报是浏览器在操作系统级别创建的对话框。 (它在桌面上显示为一个附加窗口。)您可以使用.switch_to_alert()关闭这些警报。 DOM弹出窗口只是一个碰巧在页面中使用的HTML元素,就像它是一个对话框一样。此弹出窗口仅存在于您的浏览器中。 (操作系统不知道它。)你不能使用.switch_to_alert()来关闭DOM弹出窗口。

要获取此弹出窗口并关闭它,您必须检查DOM(就像您已经开始做的那样),找到代表关闭按钮的DOM元素并让Selenium单击它。

答案 3 :(得分:0)

我遇到了类似的问题,但我们的弹出窗口的closebox webelement有一个动态id标签,很难锁定。我们最终通过使用By.className来找到它来解决它。在下面的代码中,我使用List,因为我还想查看我正在处理的元素数量,但这不是必需的。此外,如果找到窗口关闭框元素,则生产代码还有其他处理。

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