我正在尝试通过Selenium和Python 3自动执行一些繁琐的复制/粘贴我每月从我银行的在线服务。不幸的是,我无法让Selenium点击登录链接。
这是https://www1.bmo.com/onlinebanking/cgi-bin/netbnx/NBmain?product=5的蓝色继续按钮。
奇怪的是,当我尝试在Selenium启动的浏览器中手动点击该链接时,它也无法正常工作 - 而它确实可以在我手动启动的浏览器中运行。
我怀疑问题是该银行的网站足够聪明,可以检测到我正在自动化浏览器活动。有没有办法解决这个问题?
如果没有,它可能是别的吗?
我尝试过使用Chrome和Firefox - 无济于事。我正在使用64位Windows 10计算机与Chrome 73.0.3683.103和Firefox 66.0。
相关代码如下。
#websites and log in information
bmo_login_path = 'https://www1.bmo.com/onlinebanking/cgi-bin/netbnx/NBmain?product=5'
bmo_un = 'fake_user_name'
bmo_pw = 'fake_password'
#Selenium setup
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
import time
chrome_driver_path = 'C:\\Path\\To\\Driver\\chromedriver.exe'
gecko_driver_path = 'C:\\Path\\To\\Driver\\geckodriver.exe'
browswer_bmo = webdriver.Firefox(executable_path = gecko_driver_path)
#browswer_bmo = webdriver.Chrome(executable_path = chrome_driver_path)
#log into BMO
browswer_bmo.get(bmo_login_path)
time.sleep(5)
browswer_bmo.find_element_by_id('siBankCard').send_keys(bmo_un)
browswer_bmo.find_element_by_id('regSignInPassword').send_keys(bmo_pw)
browswer_bmo.find_element_by_id('btnBankCardContinueNoCache1').click()
发送键完美无缺。我可能实际上有错误的元素ID(当我意识到我无法手动点击链接时,我试图在Chrome中测试) - 但我认为更大的问题是我无法手动点击浏览器中的链接启动由Selenium提供。谢谢你的任何想法。
编辑
这是我在尝试单击“继续”按钮时获得的截图。
最终,我在IDE(Jupyter Notebook)中收到的错误信息是:
TimeoutException: Message: timeout
(Session info: chrome=74.0.3729.108)
(Driver info: chromedriver=74.0.3729.6 (255758eccf3d244491b8a1317aa76e1ce10d57e9-refs/branch-heads/3729@{#29}),platform=Windows NT 10.0.17134 x86_64)
要单击带有文本的按钮作为继续,您可以填写卡号和密码字段,为element_to_be_clickable()
引入WebDriverWait,您可以使用以下解决方案:
from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
options = webdriver.ChromeOptions()
options.add_argument('start-maximized')
options.add_argument('disable-infobars')
options.add_argument('--disable-extensions')
driver = webdriver.Chrome(chrome_options=options, executable_path=r'C:\WebDrivers\chromedriver.exe')
driver.get('https://www1.bmo.com/onlinebanking/cgi-bin/netbnx/NBmain?product=5')
WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.CSS_SELECTOR, "input.dijitReset.dijitInputInner#siBankCard[name='FBC_Number']"))).send_keys("1234567890112233")
driver.find_element_by_css_selector("input.dijitReset.dijitInputInner#regSignInPassword[name='FBC_Password']").send_keys("fake_password")
driver.find_element_by_css_selector("span.dijitReset.dijitInline.dijitIcon.dijitNoIcon").click()
# driver.quit()