如何在 Selenium Python 中处理警报提示?

问题描述 投票:0回答:1

我尝试将 Selenium 与 Python 一起使用。该脚本是通过 for 循环从网站获取文件。输入由 Excel 文件提供,读取该文件并将变量传递到

test_getcaf
,然后执行数据搜索功能。以下是我的Python脚本。

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.firefox.options import Options
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.common import exceptions
from selenium.webdriver.common.alert import Alert
import openpyxl

options = Options()
options.set_preference("browser.download.folderList", 2)
options.set_preference("browser.download.manager.showWhenStarting", False)
options.set_preference("browser.download.dir", "D:\\Path\\Script")
options.set_preference("browser.helperApps.neverAsk.saveToDisk", "application/x-gzip")
driver = webdriver.Firefox(options=options)

def test_getcaf(number, ptype):
    number = str(number)
    ptype = str(ptype)
    driver.switch_to.default_content()
    driver.implicitly_wait(1)
    driver.switch_to.frame("bodyframe")    # switch to selected iframe
    textbox_MobileNo = driver.find_element(by=By.ID, value="txtMobileNo")
    textbox_ptype = driver.find_element(by=By.ID, value="ptype")
    textbox_MobileNo.send_keys(number)
    textbox_ptype.send_keys(ptype)

    try:
        search_button = driver.find_element(By.ID, value="mainTable")
        search_button.click()     #This click can or cannot generate an alter box
        show_button = driver.find_element(By.CSS_SELECTOR, "table#deletelink tbody tr td.view_icon")
        show_button.click()

        return True
    except exceptions.UnexpectedAlertPresentException:
        driver.switch_to.alert.accept()
        return False


wb_obj = openpyxl.load_workbook("D:\\Path\\Book1.xlsx")
sheet_obj = wb_obj.active
row = sheet_obj.max_row+1
column = sheet_obj.max_column+1
# Passing the value to the function
for i in range(2, row):
    Mob_num = sheet_obj.cell(row=i, column=1).value
    Mob_type = sheet_obj.cell(row=i, column=2).value
    Return_messag = test_getcaf(Mob_num,Mob_type)
    sheet_obj.cell(row=i, column=3).value = Return_messag
    wb_obj.save("D:\\Path\\Book1.xlsx")

上面代码中,第二行的

try
块中,点击时可能会生成另一个块或者可以生成Alert框。这是一个简单的警报框,只有“确定”选项。但是运行脚本时我收到错误
selenium.common.exceptions.NoAlertPresentException: Message
以下是错误信息

selenium.common.exceptions.UnexpectedAlertPresentException: Alert Text: None
Message: Dismissed user prompt dialog: Customer details not found with the specified search
Stacktrace:
RemoteError@chrome://remote/content/shared/RemoteError.sys.mjs:8:8
WebDriverError@chrome://remote/content/shared/webdriver/Errors.sys.mjs:187:5
UnexpectedAlertOpenError@chrome://remote/content/shared/webdriver/Errors.sys.mjs:704:5
GeckoDriver.prototype._handleUserPrompts@chrome://remote/content/marionette/driver.sys.mjs:2832:13


During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "D:\Search CAF\CCMS\test_fire.py", line 110, in <module>
    Return_messag = test_getcaf(Mob_num,Mob_type)
                    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "D:\Search CAF\CCMS\test_fire.py", line 74, in test_getcaf
    driver.switch_to.alert.accept()
    ^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\JTOITWB\AppData\Local\Programs\Python\Python311\Lib\site-packages\selenium\webdriver\remote\switch_to.py", line 55, in alert
    _ = alert.text
        ^^^^^^^^^^
  File "C:\Users\JTOITWB\AppData\Local\Programs\Python\Python311\Lib\site-packages\selenium\webdriver\common\alert.py", line 59, in text
    return self.driver.execute(Command.W3C_GET_ALERT_TEXT)["value"]
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\JTOITWB\AppData\Local\Programs\Python\Python311\Lib\site-packages\selenium\webdriver\remote\webdriver.py", line 346, in execute
    self.error_handler.check_response(response)
  File "C:\Users\JTOITWB\AppData\Local\Programs\Python\Python311\Lib\site-packages\selenium\webdriver\remote\errorhandler.py", line 245, in check_response
    raise exception_class(message, screen, stacktrace)
selenium.common.exceptions.NoAlertPresentException: Message: 
Stacktrace:
RemoteError@chrome://remote/content/shared/RemoteError.sys.mjs:8:8
WebDriverError@chrome://remote/content/shared/webdriver/Errors.sys.mjs:187:5
NoSuchAlertError@chrome://remote/content/shared/webdriver/Errors.sys.mjs:489:5
GeckoDriver.prototype._checkIfAlertIsPresent@chrome://remote/content/marionette/driver.sys.mjs:2803:11
GeckoDriver.prototype.getTextFromDialog@chrome://remote/content/marionette/driver.sys.mjs:2751:8
despatch@chrome://remote/content/marionette/server.sys.mjs:320:40
execute@chrome://remote/content/marionette/server.sys.mjs:291:16
onPacket/<@chrome://remote/content/marionette/server.sys.mjs:264:20
onPacket@chrome://remote/content/marionette/server.sys.mjs:265:9
_onJSONObjectReady/<@chrome://remote/content/marionette/transport.sys.mjs:496:20

我也尝试过使用

else
finally
选项,但是调用
test_getcaf
函数的 for 循环只会跳过
try
块,并且仅调用
else
finally
选项。

我什至也尝试过

if driver.switch_to.alert:
,但这也不起作用。

有人可以告诉我我在这里做错了什么吗?

Screenshot 1

python python-3.x selenium-webdriver web-scraping selenium-firefoxdriver
1个回答
0
投票

这只是一个结论(没有可重现的例子我无法重新检查)。 图像上显示的警报是本机浏览器警报,因此我猜它位于

default_context
中。 当您期望它出现时,您位于
iframe
,而 iframe 对此警报一无所知。

except exceptions.UnexpectedAlertPresentException:
   driver.switch_to.default_content()
   driver.switch_to.alert.accept()
   return False
© www.soinside.com 2019 - 2024. All rights reserved.