我尝试将 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:
,但这也不起作用。
有人可以告诉我我在这里做错了什么吗?
这只是一个结论(没有可重现的例子我无法重新检查)。 图像上显示的警报是本机浏览器警报,因此我猜它位于
default_context
中。
当您期望它出现时,您位于 iframe
,而 iframe 对此警报一无所知。
except exceptions.UnexpectedAlertPresentException:
driver.switch_to.default_content()
driver.switch_to.alert.accept()
return False