如何在python中使用Selenium关闭浏览器弹出窗口?

如何在python中使用Selenium关闭浏览器弹出窗口?,python,selenium,Python,Selenium,我正在尝试使用Python和Selenium自动下载。在“开始”页面中,页面上会出现一个弹出窗口: 如何使用Selenium关闭它 我尝试了以下方法,但都失败了: >>> alert = browser.switch_to_alert() >>> alert.accept() Traceback (most recent call last): File "<input>", line 1, in <module> File

我正在尝试使用Python和Selenium自动下载。在“开始”页面中,页面上会出现一个弹出窗口:

如何使用Selenium关闭它

我尝试了以下方法,但都失败了:

>>> alert = browser.switch_to_alert()

>>> alert.accept()
Traceback (most recent call last):
  File "<input>", line 1, in <module>
  File "/usr/lib/python2.7/dist-packages/selenium/webdriver/common/alert.py", line 80, in accept
    self.driver.execute(Command.ACCEPT_ALERT)
  File "/usr/lib/python2.7/dist-packages/selenium/webdriver/remote/webdriver.py", line 201, in execute
    self.error_handler.check_response(response)
  File "/usr/lib/python2.7/dist-packages/selenium/webdriver/remote/errorhandler.py", line 181, in check_response
    raise exception_class(message, screen, stacktrace)
NoAlertPresentException: Message: no alert open
  (Session info: chrome=59.0.3071.115)
  (Driver info: chromedriver=2.30.477691 (6ee44a7247c639c0703f291d320bdf05c1531b57),platform=Linux 4.4.0-57-generic x86_64)

>>> alert.dismiss()
Traceback (most recent call last):
  File "<input>", line 1, in <module>
  File "/usr/lib/python2.7/dist-packages/selenium/webdriver/common/alert.py", line 71, in dismiss
    self.driver.execute(Command.DISMISS_ALERT)
  File "/usr/lib/python2.7/dist-packages/selenium/webdriver/remote/webdriver.py", line 201, in execute
    self.error_handler.check_response(response)
  File "/usr/lib/python2.7/dist-packages/selenium/webdriver/remote/errorhandler.py", line 181, in check_response
    raise exception_class(message, screen, stacktrace)
NoAlertPresentException: Message: no alert open
  (Session info: chrome=59.0.3071.115)
  (Driver info: chromedriver=2.30.477691 (6ee44a7247c639c0703f291d320bdf05c1531b57),platform=Linux 4.4.0-57-generic x86_64)


>>>alert = browser.switch_to_window('Open xdg-open?')
Traceback (most recent call last):
  File "<input>", line 1, in <module>
  File "/usr/lib/python2.7/dist-packages/selenium/webdriver/remote/webdriver.py", line 531, in switch_to_window
    self._switch_to.window(window_name)
  File "/usr/lib/python2.7/dist-packages/selenium/webdriver/remote/switch_to.py", line 92, in window
    self._driver.execute(Command.SWITCH_TO_WINDOW, data)
  File "/usr/lib/python2.7/dist-packages/selenium/webdriver/remote/webdriver.py", line 201, in execute
    self.error_handler.check_response(response)
  File "/usr/lib/python2.7/dist-packages/selenium/webdriver/remote/errorhandler.py", line 181, in check_response
    raise exception_class(message, screen, stacktrace)
NoSuchWindowException: Message: no such window
  (Session info: chrome=59.0.3071.115)
  (Driver info: chromedriver=2.30.477691 (6ee44a7247c639c0703f291d320bdf05c1531b57),platform=Linux 4.4.0-57-generic x86_64)


>>> alert = browser.switch_to.window("Open xdg-open?")
Traceback (most recent call last):
  File "<input>", line 1, in <module>
  File "/usr/lib/python2.7/dist-packages/selenium/webdriver/remote/switch_to.py", line 92, in window
    self._driver.execute(Command.SWITCH_TO_WINDOW, data)
  File "/usr/lib/python2.7/dist-packages/selenium/webdriver/remote/webdriver.py", line 201, in execute
    self.error_handler.check_response(response)
  File "/usr/lib/python2.7/dist-packages/selenium/webdriver/remote/errorhandler.py", line 181, in check_response
    raise exception_class(message, screen, stacktrace)
NoSuchWindowException: Message: no such window
  (Session info: chrome=59.0.3071.115)
  (Driver info: chromedriver=2.30.477691 (6ee44a7247c639c0703f291d320bdf05c1531b57),platform=Linux 4.4.0-57-generic x86_64)
>>警报=浏览器。切换到警报()
>>>alert.accept()
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
文件“/usr/lib/python2.7/dist packages/selenium/webdriver/common/alert.py”,第80行,在accept中
self.driver.execute(Command.ACCEPT\u警报)
文件“/usr/lib/python2.7/dist packages/selenium/webdriver/remote/webdriver.py”,执行中的第201行
self.error\u handler.check\u响应(响应)
文件“/usr/lib/python2.7/dist packages/selenium/webdriver/remote/errorhandler.py”,第181行,在check_响应中
引发异常类(消息、屏幕、堆栈跟踪)
NoAlertPresentException:消息:无警报打开
(会话信息:chrome=59.0.3071.115)
(驱动程序信息:chromedriver=2.30.477691(6ee44a7247c639c0703f291d320bdf05c1531b57),平台=Linux 4.4.0-57-generic x86_64)
>>>警惕。解散()
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
文件“/usr/lib/python2.7/dist packages/selenium/webdriver/common/alert.py”,第71行
self.driver.execute(命令.解除警报)
文件“/usr/lib/python2.7/dist packages/selenium/webdriver/remote/webdriver.py”,执行中的第201行
self.error\u handler.check\u响应(响应)
文件“/usr/lib/python2.7/dist packages/selenium/webdriver/remote/errorhandler.py”,第181行,在check_响应中
引发异常类(消息、屏幕、堆栈跟踪)
NoAlertPresentException:消息:无警报打开
(会话信息:chrome=59.0.3071.115)
(驱动程序信息:chromedriver=2.30.477691(6ee44a7247c639c0703f291d320bdf05c1531b57),平台=Linux 4.4.0-57-generic x86_64)
>>>警报=浏览器。切换到窗口(“打开xdg打开”)
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
文件“/usr/lib/python2.7/dist packages/selenium/webdriver/remote/webdriver.py”,第531行,在“切换到”窗口中
self.\u切换到.window(窗口名称)
文件“/usr/lib/python2.7/dist packages/selenium/webdriver/remote/switch_to.py”,第92行,在窗口中
self.\u driver.execute(Command.SWITCH\u TO\u窗口,数据)
文件“/usr/lib/python2.7/dist packages/selenium/webdriver/remote/webdriver.py”,执行中的第201行
self.error\u handler.check\u响应(响应)
文件“/usr/lib/python2.7/dist packages/selenium/webdriver/remote/errorhandler.py”,第181行,在check_响应中
引发异常类(消息、屏幕、堆栈跟踪)
NoSuchWindowException:消息:没有这样的窗口
(会话信息:chrome=59.0.3071.115)
(驱动程序信息:chromedriver=2.30.477691(6ee44a7247c639c0703f291d320bdf05c1531b57),平台=Linux 4.4.0-57-generic x86_64)
>>>警报=浏览器。切换到。窗口(“打开xdg打开?”)
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
文件“/usr/lib/python2.7/dist packages/selenium/webdriver/remote/switch_to.py”,第92行,在窗口中
self.\u driver.execute(Command.SWITCH\u TO\u窗口,数据)
文件“/usr/lib/python2.7/dist packages/selenium/webdriver/remote/webdriver.py”,执行中的第201行
self.error\u handler.check\u响应(响应)
文件“/usr/lib/python2.7/dist packages/selenium/webdriver/remote/errorhandler.py”,第181行,在check_响应中
引发异常类(消息、屏幕、堆栈跟踪)
NoSuchWindowException:消息:没有这样的窗口
(会话信息:chrome=59.0.3071.115)
(驱动程序信息:chromedriver=2.30.477691(6ee44a7247c639c0703f291d320bdf05c1531b57),平台=Linux 4.4.0-57-generic x86_64)

您应该先尝试一下,看看这是否是与等待相关的错误。
i、 e:如果您的浏览器在执行操作之前没有足够的时间找到警报对话框。您可以了解有关显式等待的更多信息

您还需要软件包并尝试以下操作:

# add these imports
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.common.exceptions import TimeoutException

#try to find the alert and do stuff
try:
    #wait for the alert to show up
    WebDriverWait(browser, 3).until(EC.alert_is_present(),
                               'Timed out waiting for PA creation ' +
                               'confirmation popup to appear.')
    #if it does
    alert = browser.switch_to.alert()
    alert.accept()
    print "alert accepted"
except TimeoutException:
    print "no alert"
请注意,我精确地等待了3秒钟,您可以将其更改为您喜欢的任何内容


如果此解决方案不起作用,您应该尝试一种技巧,通过名称或文本等显式选择对话框弹出窗口。

您面临的问题是,弹出窗口不是DOM的一部分,因此selenium无法通过发送击键、等待或单击某处来处理。弹出窗口是浏览器本机弹出窗口,因此只能由浏览器本身处理,通常由用户交互处理

为了防止交互,您可以预先定义在链接使用特定协议的情况下浏览器应采取的操作。想想有电话链接的HREF:

<p>Book now, call <a href="tel:01234567890">01234 567 890</a></p>

在你的例子中,它可能是一个googlePlay链接。因此,与其使用有问题的协议,不如切换到对话框并单击“不打开”:driver。通过xpath('//div[contains(@class,“ui dialog”)和@aria descripebby=“dialogContent2”]//按钮[@title=“not open”]”查找元素。单击()您是否尝试过使用显式等待警报出现?@RayhaneMama什么是显式等待?“我怎么能做到?”安舒尔古普塔没用。无法在页面中调整此元素。@您可能必须根据DOM修改诸如div contains等元素。我给了你一个例子。不工作,我们无法找到dailog弹出窗口的名称,因为它不是当前打开页面的源代码的一部分。它不是DOM的一部分,而是本机浏览器。如何关闭它?
from selenium.webdriver.chrome.options import Options
chrome_options = Options()
chrome_options.add_experimental_option( "prefs", {'protocol_handler.excluded_schemes.tel': false})
driver = webdriver.Chrome(chrome_options=chrome_options)