Python+;Selenium-Microsoft2FA

Python+;Selenium-Microsoft2FA,python,selenium,two-factor-authentication,Python,Selenium,Two Factor Authentication,我正在尝试使用Python和Selenium登录Azure DevOps。我可以输入用户名和密码,但我的手机上有Microsoft Authenticator应用程序,在尝试登录时会提示我“批准”或“拒绝” 我试着让Selenium等到“保持登录”页面上的“否”按钮元素出现(见下面的屏幕截图), 但它似乎不喜欢它。我看了一下谷歌的验证器。该解决方案使用谷歌认证器的秘密,以及pyotp。我似乎找不到办法从微软验证器那里得到一个秘密,至少对我自己来说是这样。我签出了指南,但我没有访问Azure广告的

我正在尝试使用Python和Selenium登录Azure DevOps。我可以输入用户名和密码,但我的手机上有Microsoft Authenticator应用程序,在尝试登录时会提示我“批准”或“拒绝”

我试着让Selenium等到“保持登录”页面上的“否”按钮元素出现(见下面的屏幕截图), 但它似乎不喜欢它。我看了一下谷歌的验证器。该解决方案使用谷歌认证器的秘密,以及pyotp。我似乎找不到办法从微软验证器那里得到一个秘密,至少对我自己来说是这样。我签出了指南,但我没有访问Azure广告的权限

以下是我尝试在2FA之后等待屏幕的代码:

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
部分,然后让代码失败…这样您就可以知道错误是什么…将错误发送给我。。