首页 > 解决方案 > Selenium 关闭/接受 Chrome 确认弹出窗口

问题描述

我目前正在自动化日常流程之一,并且到了出现 chrome 弹出窗口的地步:

在此处输入图像描述

我试图:

alert = browser.switch_to.alert
alert.dismiss()

堆栈跟踪:

C:\...>python "C:\\...\\script.py" username pwd code

DevTools listening on ws://127.0.0.1:61324/devtools/browser/464b40f5-dc5b-4fec-be25-35fdadb765e5
[14564:15520:0904/092015.725:ERROR:device_event_log_impl.cc(208)] [09:20:15.725] Bluetooth: bluetooth_adapter_winrt.cc:1074 Getting Default Adapter failed.
Traceback (most recent call last):
  File "C:\...\script.py", line 53, in <module>
    alert = browser.switch_to.alert
  File "C:\...\Local\Programs\Python\Python38-32\lib\site-packages\selenium-3.141.0-py3.8.egg\selenium\webdriver\remote\switch_to.py", line 55, in alert
    alert.text
  File "C:\...\Local\Programs\Python\Python38-32\lib\site-packages\selenium-3.141.0-py3.8.egg\selenium\webdriver\common\alert.py", line 67, in text
    return self.driver.execute(Command.W3C_GET_ALERT_TEXT)["value"]
  File "C:\...\Local\Programs\Python\Python38-32\lib\site-packages\selenium-3.141.0-py3.8.egg\selenium\webdriver\remote\webdriver.py", line 321, in execute
    self.error_handler.check_response(response)
  File "C:\...\Local\Programs\Python\Python38-32\lib\site-packages\selenium-3.141.0-py3.8.egg\selenium\webdriver\remote\errorhandler.py", line 242, in check_response
    raise exception_class(message, screen, stacktrace)
selenium.common.exceptions.NoAlertPresentException: Message: no such alert
  (Session info: chrome=85.0.4183.83)

我试过使用time.sleep(2),但没有帮助。

还有其他方法可以检测到这个窗口吗?或者在这种情况下,我们可以通过 ChromeOptions 允许打开启动器,从而阻止此窗口。

任何帮助表示赞赏。

我的代码(我是初学者):

from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.desired_capabilities import DesiredCapabilities
from selenium.webdriver.support import expected_conditions as EC

import time
import sys

url = "link"
argv = sys.argv[1:]

if argv and len(argv) == 3:

    browser = webdriver.Chrome(executable_path="...\\chromedriver.exe")
    browser.get(url)
    time.sleep(2)

    if browser.title == "the_title":

        # Login

        time.sleep(2)
        
        username = browser.find_element_by_name("field1")
        password = browser.find_element_by_name("field2")
        security_code = browser.find_element_by_name("field3")

        username.send_keys(sys.argv[1])
        password.send_keys(sys.argv[2])
        security_code.send_keys(sys.argv[3])

        submit = browser.find_element_by_id("submit")

        submit.click()

        # Detect

        time.sleep(5)
        detect = browser.find_element_by_id("detect_button")
        detect.click()

        time.sleep(2)

        # stuck at this point
        alert = browser.switch_to.alert
        alert.dismiss()
        #WebDriverWait(browser, 5).until(lambda d: browser.switch_to_window(str(d.window_handles)))

        # steps after
        ...

    else:
        print("Failed to load the page")

else:
    print("Invalid/Incorrect arguments passed. Provided arguments: " + str(argv))

browser.quit()

标签: pythonseleniumselenium-webdriverselenium-chromedriver

解决方案


在网页上,每当警报出现时,我们需要检查它实际上是警报还是只是页面本身的一部分。您可以通过检查警报进行检查,

如果警报不允许您检查它,则表示它处于警报状态。在这种情况下,

alert = browser.switch_to.alert
alert.dismiss()

这些命令运行,如果警报需要时间来,那么在这里使用显式等待

例如:

alert = wait.until(EC.alert_is_present())
print(alert.text)
# alert.accept()
alert.dismiss() 

这些将仅适用于导入from selenium.webdriver.support import expected_conditions as ECfrom selenium.webdriver.support.wait import WebDriverWait

但是如果您能够检查它并查找它具有的属性,这意味着它不是警报,您必须像处理其他元素一样处理页面的一部分。根据您收到的错误NoAlertPresentException,这清楚地表明没有警报。


推荐阅读