python - 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()
解决方案
在网页上,每当警报出现时,我们需要检查它实际上是警报还是只是页面本身的一部分。您可以通过检查警报进行检查,
如果警报不允许您检查它,则表示它处于警报状态。在这种情况下,
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 EC
和from selenium.webdriver.support.wait import WebDriverWait
但是如果您能够检查它并查找它具有的属性,这意味着它不是警报,您必须像处理其他元素一样处理页面的一部分。根据您收到的错误NoAlertPresentException
,这清楚地表明没有警报。
推荐阅读
- jmespath - 在 JMESPath 中使用过滤器时,如何将一个数组级别的字段与嵌套数组级别的字段连接起来
- python - Django 服务器刚刚停止
- ruby - 捕获和记录黄瓜测试结果
- c++ - 在创建c ++期间调用对象方法
- angular - 仅将少量值从一个角度分量传递到另一个分量
- javascript - 从 firebase 格式更改中获取日期
- react-native - 我正在尝试从子组件打开模式
- flutter - 使用flutter ListView builder抛出错误
- office-ui-fabric - 在 Office UI Fabric 详细信息列表中选择新添加的行
- django - 注册 django 应用程序时出现 ModuleNotFoundError