Selenium驱动程序因操作系统警报而挂起

3phpmpom  于 2022-11-29  发布在  其他
关注(0)|答案(3)|浏览(153)

bounty将在5天后过期。回答此问题可获得+200声望奖励。Jessica Chambers希望吸引更多人关注此问题。

我在Python(3.11)中使用Selenium,并使用Firefox(107)驱动程序。
通过驱动程序,我导航到一个页面,在几个操作之后,触发了一个操作系统警报(提示我启动一个程序)。当这个警报弹出时,驱动程序挂起,只有在手动关闭它之后,我的脚本才能继续运行。
我已经尝试了driver.quit(),以及使用

os.system("taskkill /F /pid " + str(process.ProcessId))

查到了司机的身份证,但没查到
我已经设法阻止弹出窗口弹出

options.set_preference("security.external_protocol_requires_permission", False)

但是代码仍然以同样的方式挂起在弹出窗口 * 应该 * 弹出的位置。
我不在乎程序是否启动,我只需要我的代码在这个关键点上不需要人为干预。
下面是我目前拥有一个最小的例子:

from selenium.webdriver import ActionChains, Keys
from selenium.webdriver.firefox.options import Options
from seleniumwire import webdriver

options = Options()
options.binary_location = r'C:\Program Files\Mozilla Firefox\firefox.exe'
options.set_preference("security.external_protocol_requires_permission", False)
driver = webdriver.Firefox(options=options)

# Go to the page
driver.get(url)

user_field = driver.find_element("id", "UserName")
user_field.send_keys(username)
pass_field = driver.find_element("id", "Password")
pass_field.send_keys(password)
pass_field.send_keys(Keys.ENTER)

#this is the point where the pop up appears

reqs = driver.requests

print("Success!")
driver.quit()
ukdjmx9f

ukdjmx9f1#

手动选中此复选框,然后为与您使用的链接关联的每个应用程序打开应用程序,然后它将正常工作。

ercv8c1e

ercv8c1e2#

您可以尝试一些首选项

profile = webdriver.FirefoxProfile()
profile.set_preference('dom.push.enabled', False)

# or

profile = webdriver.FirefoxProfile()
profile.set_preference('dom.webnotifications.enabled', False)
profile.set_preference('dom.webnotifications.serviceworker.enabled', False)
ycl3bljg

ycl3bljg3#

您是否尝试过设置此首选项以阻止特定弹出窗口:

profile.set_preference('browser.helperApps.neverAsk.openFile', 'typeOfFile')  
# e.g. profile.set_preference('browser.helperApps.neverAsk.openFile', 'application/xml,application/octet-stream')

或者您是否尝试过关闭弹出窗口:

from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

....
pass_field.send_keys(Keys.ENTER)

#this is the point where the pop up appears
WebDriverWait(driver, 5).until(EC.alert_is_present).dismiss()
reqs = driver.requests
...

相关问题