Python+;Selenium-Microsoft2FA
我正在尝试使用Python和Selenium登录Azure DevOps。我可以输入用户名和密码,但我的手机上有Microsoft Authenticator应用程序,在尝试登录时会提示我“批准”或“拒绝” 我试着让Selenium等到“保持登录”页面上的“否”按钮元素出现(见下面的屏幕截图), 但它似乎不喜欢它。我看了一下谷歌的验证器。该解决方案使用谷歌认证器的秘密,以及pyotp。我似乎找不到办法从微软验证器那里得到一个秘密,至少对我自己来说是这样。我签出了指南,但我没有访问Azure广告的权限 以下是我尝试在2FA之后等待屏幕的代码:Python+;Selenium-Microsoft2FA,python,selenium,two-factor-authentication,Python,Selenium,Two Factor Authentication,我正在尝试使用Python和Selenium登录Azure DevOps。我可以输入用户名和密码,但我的手机上有Microsoft Authenticator应用程序,在尝试登录时会提示我“批准”或“拒绝” 我试着让Selenium等到“保持登录”页面上的“否”按钮元素出现(见下面的屏幕截图), 但它似乎不喜欢它。我看了一下谷歌的验证器。该解决方案使用谷歌认证器的秘密,以及pyotp。我似乎找不到办法从微软验证器那里得到一个秘密,至少对我自己来说是这样。我签出了指南,但我没有访问Azure广告的
def signin(user, passwd):
# find elements before passing information
username = browser.find_element_by_name('loginfmt')
username.send_keys(user)
username.send_keys(Keys.ENTER)
time.sleep(1)
password = browser.find_element_by_name('passwd')
password.send_keys(passwd)
password.send_keys(Keys.ENTER)
try:
WebDriverWait(browser, 60).until(
EC.element_to_be_clickable((By.ID, "idBtn_Back"))
).click()
finally:
sys.exit('Timeout for 2FA approval reached. Try again.')
不幸的是,正如我在上面简要提到的,即使在“保持登录”页面出现之后,Python也无法检测到“否”按钮。我真的不在乎使用哪个按钮,因为脚本使用的是我未登录的浏览器的单独实例
我考虑过设置一个长的时间.sleep()
命令,但这似乎是一个非常愚蠢的方法。有人有什么建议吗
Python无法检测到“否”按钮
相信我,每当我发现Python中发生了一些奇怪的事情,一些完全没有意义的事情,程序根本不按要求做,我总是在那里找到一个try except
语句。我的朋友是你的错
还有。无论try
有效还是失败
WebDriverWait(浏览器,60)。直到(
EC.元素可点击((By.ID,“idBtn\u Back”))
)。单击()
这完全是错误的!尝试自己运行它:
---------------------------------------------------------------------------
AttributeError回溯(最近一次呼叫上次)
在里面
9
10 WebDriverWait(驱动程序,60)。直到(EC.元素可点击((By.ID,“i0116”))
--->11驱动程序。通过id(“i0116”)查找元素。发送密钥(“u18ec013@svnitsuratg.onmicrosoft.com)点击()
12
13 WebDriverWait(驱动程序,60)。直到(EC.元素可点击((By.ID,“idSIButton9”))
AttributeError:“非类型”对象没有“单击”属性
因为您根本无法调用。在WebDriverWait
的输出(即None
)上单击()
以下代码可以正常工作:
从selenium导入webdriver
从selenium.webdriver.common.by导入
从selenium.webdriver.support.ui导入WebDriverWait
从selenium.webdriver.support将预期的_条件导入为EC
driver=webdriver.Chrome(可执行文件\u path='path/to/executable')
驱动程序。获取(“https://login.microsoftonline.com")
WebDriverWait(驱动程序,60)。直到(EC.元素可点击((By.ID,“i0116”))
驱动程序。通过id(“i0116”)查找元素。发送密钥(“您的电子邮件id”)
WebDriverWait(驱动程序,60)。直到(EC.元素可点击((By.ID,“idSIButton9”))
驱动程序。按id(“idSIButton9”)查找元素。单击()
驱动程序。通过id(“i0118”)查找元素。发送密钥(“您的密码”)
WebDriverWait(驱动程序,60)。直到(EC.元素可点击((By.ID,“idSIButton9”))
驱动程序。按id(“idSIButton9”)查找元素。单击()
WebDriverWait(驱动程序,60)。直到(EC.元素可点击((By.ID,“idSIButton9”))
驱动程序。按id(“idSIButton9”)查找元素。单击()
在您的情况下,您只需将其更改为:
def signin(user, passwd):
# find elements before passing information
username = browser.find_element_by_name('loginfmt')
username.send_keys(user)
username.send_keys(Keys.ENTER)
time.sleep(1)
password = browser.find_element_by_name('passwd')
password.send_keys(passwd)
password.send_keys(Keys.ENTER)
try:
WebDriverWait(browser, 60).until(EC.element_to_be_clickable((By.ID, "idBtn_Back")))
browser.find_element_by_id("idSIButton9").click()
except:
sys.exit('Timeout for 2FA approval reached. Try again.')
链接到网站?@Yatin的URL是https://.visualstudio.com/
,但您会立即重定向到登录页面,例如-https://login.microsoftonline.com/9fdf2c7e-d190-4b8e-ba6b-2cd9be62632e/oauth2/authorize?client_id=
谢谢你回复我Yatin!不幸的是,您发送的最后一个区块不起作用。我仍然在超时。控制台立即抛出超时错误。@Flu17您最后没有使用
<代码>最后
将始终执行。因此,即使try
中的代码有效,最终也会执行。现在看代码哦,我明白了,是的,这很有效,谢谢。只是try
部分仍不工作:(“仍不工作”尝试删除try
部分,然后让代码失败…这样您就可以知道错误是什么…将错误发送给我。。