具有 Windows 安全性的 Python Selenium 网页 [英] Python Selenium Webpage with Windows Security
问题描述
我正在尝试定期从我组织的网站自动下载一些 CSV.他们太友好了,不给我后端数据库访问或 API,所以我不得不凑齐一些东西来为我解决这个问题.该网站是一个 Oracle PeopleSoft 站点,它甚至在页面加载之前就使用 Windows Security
模式进行提示.
I am trying to autonomously download some CSVs on a regular basis from a website at my organization. They were so kind as to not afford me back-end database access or an API so I am having to hobble together something to take care of this for me. The website is an Oracle PeopleSoft site that prompts with a Windows Security
modal before the page even loads.
我使用 Edge 是因为该站点似乎不喜欢 Firefox,而 Chrome 在 Selenium 中给我带来了麻烦.我过去曾能够以这种方式从 OBIEE 网站上抓取数据,但这种方式给我带来了麻烦.下面的代码是我用来访问页面并尝试处理登录模式的代码.单步执行我的代码,似乎我根本没有通过 driver.get(url)
行.
I am using Edge because the site doesn't seem to like Firefox and Chrome is giving me trouble in Selenium. I have in the past been able to scrape from OBIEE sites in this manner but this one is giving me trouble. The code below is what I am using to access the page and attempt to handle the login modal. Stepping through my code it seems that I don't get past the driver.get(url)
line at all.
有没有人有关于如何处理这个问题的建议?
Does anyone have suggestions on how to handle this?
driver = webdriver.Edge(EdgeDriverManager().install())
driver.get(url)
# Wait till the modal prompts you to log in
wait(driver, 5).until(EC.alert_is_present())
alert = driver.switch_to_alert()
# Provide creds with a tab in between so that you change from username field to password field
alert.send_keys(config.myUSERNAME + Keys.TAB + config.myPASSWORD)
# click ok
alert.accept()
01/25/2018
尝试按照建议使用 Autoit,但我仍然遇到问题.webdriver 在运行时似乎不允许发生任何其他事情.有关如何处理此问题的任何建议?
01/25/2018
Trying to use Autoit as suggested and I am still having problems. The webdriver seems to not allow anything else to happen while its running. Any suggestions on how to handle this?
def browser(url):
driver = webdriver.Edge(EdgeDriverManager().install())
driver.get(url)
def login_handler(username, password):
print('This print never gets run? What is up with this?!')
# autoit.win_wait_active("Credential Dialog Xaml Host")
autoit.win_exists("Windows Security", "CORP\\")
# also tried this
# autoit.win_wait_active("Windows Security")
autoit.send(username)
autoit.send("{TAB}")
autoit.send(password)
autoit.send("{ENTER}")
t1 = Thread(target=browser(url))
t2 = Thread(target=login_handler(config.myUSERNAME, config.myPASSWORD))
t2.start()
t1.start()
推荐答案
Selenium 和 Autoit 的多线程似乎是不可能的,或者至少我还没有弄清楚(请随意证明我错了..请).我可以通过从 selenium 脚本运行 autoit 脚本来解决这个问题.
It appears that its not possible to multi-thread Selenium and Autoit, or at least I haven't figured it out yet (feel free to prove me wrong..please). I was able to side step this problem by just running the autoit script from the selenium script.
import autoit
import os
import config
import datetime
import time
def login_handler(username, password):
"""
Hey Windows Security People this is what I think of you pesky Windows Security modal (ಠ_ಠ)┌∩┐
Python to rule the world!
:param username: String
:param password: String
:return:
"""
# just chill out and wait to see a window with the title 'Windows Security
autoit.win_wait("Windows Security")
# now make that crap active so we can do stuff to it
autoit.win_activate("Windows Security")
# type in the username
autoit.send(username)
# tab to the password field
autoit.send("{TAB}")
# type in the password
autoit.send(password)
# kill!
autoit.send("{ENTER}")
if __name__ == "__main__":
# cause this is not thread safe or I am too ignorant to figure out how to do this in single python program
# I am running this in the background persistently so that the scraper doens't ever have to worry about the
# silly Windows Security modal
while True:
try:
login_handler(config.myUSERNAME, config.myPASSWORD)
except:
print("Got some ERROR @ {} \nAnd I'm too laszy to figure out how to deal with it properly so you get this message.".format(datetime.datetime.now()))
scraper.py
from webdriver_manager.driver import EdgeDriver
from webdriver_manager.microsoft import EdgeDriverManager
from selenium import webdriver
import sys
import os
os.system('python windows_securit_login_handler.py')
driver = webdriver.Edge(EdgeDriverManager().install())
driver.get(url)
... more code to do scraping type things ...
这篇关于具有 Windows 安全性的 Python Selenium 网页的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!