如何使用 selenium 在某些网站中使用 kakao、google、naver id 自动登录

Posted

技术标签:

【中文标题】如何使用 selenium 在某些网站中使用 kakao、google、naver id 自动登录【英文标题】:how to auto login with kakao, google, naver id in certain web site using selenium 【发布时间】:2022-01-20 02:49:16 【问题描述】:

我正在尝试制作本网站的 selenium 登录代码。 selenium 登录密钥出错。

https://member.jinhak.com/MemberV3/MemberJoin/MemberLogIn.aspx?ReturnSite=JM&ReturnURL=http%3a%2f%2fwww.jinhak.com%2findex.aspx

如果我单击每个按钮。他们显示登录选项卡。

例如,当我单击 naver 登录按钮并从 devtools 获取 xpath 时。但是在执行代码时,各种登录选项卡都会出现此错误

消息:没有这样的元素:无法找到元素: [@id="id"]

我想知道他们为什么不工作。

   nick = input('id : ').strip()
    pwd = input('password ').strip()
    nick_type = (input('id type [default : None naver : 1 kakao : 2 google : 3] : ') or None)
    # fname = (input('path to existing excel file(test.xlsx) : ') or './test.xlsx').strip()


    options = Options()
    # options.headless = True
    driver = webdriver.Chrome(executable_path=ChromeDriverManager().install(), options=options)

    driver.implicitly_wait(10)
    driver.get("https://www.jinhak.com/")

    driver.find_element(By.XPATH,'//*[@id="util"]/div/ul/li[1]/a').click()

    if nick_type:
        try: 
            if nick_type == 'naver' or nick_type == '1':
                driver.find_element(By.ID,'naverIdLogin_loginButton').click()
                driver.switch_to.window(driver.window_handles[-1])
                #login = driver.find_element(By.XPATH,'//*[@id="frmNIDLogin"]/ul/li/div/div[2]').send_keys(nick)
                login.find_element(By.XPATH,'//*[@id="id"]').send_keys(nick)
                login.find_element(By.XPATH,'//*[@id="pw"]').send_keys(pwd)
                driver.find_element(By.ID,'log.login').click()
            elif nick_type == 'kakao' or nick_type == '2':
                driver.find_element(By.ID,'btnLoginK').click()
                driver.switch_to.window(driver.window_handles[-1])  
                id = driver.find_element(By.XPATH,'//*[@id="id_email_2_label"]/span[1]').click()
                id.find_element(By.XPATH, '//*[@id="id_email_2"]').send_keys(nick)
                driver.find_element(By.XPATH,'//*[@id="loginEmailField"]/p').click()
                driver.find_element(By.XPATH, '//*[@id="id_password_3"]').click().send_keys(pwd)
                driver.find_element(By.XPATH,'//*[@id="login-form"]/fieldset/div[8]/button[1]').click()
            elif nick_type == 'google' or nick_type == '3':
                driver.find_element(By.ID,'btnLoginG').click()
                driver.switch_to.window(driver.window_handles[-1])
                driver.find_element(By.XPATH,'//*[@id="identifierId"]').click()
                driver.find_element(By.XPATH,'//*[@id="identifierId"]').click().send_keys(nick)
                driver.find_element(By.XPATH,'//*[@id="identifierNext"]/div/button/span').click()
                driver.find_element(By.XPATH,'//*[@id="password"]/div[1]/div/div[1]/input').send_keys(pwd)
                driver.find_element(By.XPATH,'//*[@id="identifierNext"]/div/button/span').click()
        except Exception as e:
            print(e)
    else:
        driver.find_element(By.XPATH,'//*[@id="txtMemID"]').send_keys(nick)
        driver.find_element(By.XPATH,'//*[@id="txtMemPass"]').send_keys(pwd)
        driver.find_element(By.XPATH,'//*[@id="panel_1"]/div/div[1]/div[3]/button').click()

【问题讨论】:

是naver绿色N。你也可以展示你的尝试。 是的,naver 是绿色的,kakao 是黄色的 我在您的代码中看不到 //*[@id="id_line"]。错误出现在代码的哪一步?当您插入用户名和密码并单击登录按钮时会发生什么? 插入id不起作用.. 我已将其更改为 [@id="id"] 【参考方案1】:
wait=WebDriverWait(driver,10)                                 

driver.get('https://www.jinhak.com/')

nick=1
us='1'
pw='1'
wait.until(EC.number_of_windows_to_be(2))
driver.switch_to.window(driver.window_handles[-1])
driver.close()
driver.switch_to.window(driver.window_handles[-1])
driver.find_element(By.XPATH,'//*[@id="util"]/div/ul/li[1]/a').click()
try:
    if nick==1:
        driver.find_element(By.ID,'naverIdLogin_loginButton').click()
        wait.until(EC.number_of_windows_to_be(2))
        driver.switch_to.window(driver.window_handles[-1])
        driver.find_element(By.ID,'id').send_keys(us)        
        driver.find_element(By.ID,'pw').send_keys(pw)
        driver.find_element(By.ID,'log\.login').click()  
    elif nick==2:
        pass
    elif nick==3:
        pass
    else:
        pass
except Exception as e:
    print(str(e))
    pass

主要问题是驱动程序句柄的处理、关闭然后切换到不同的窗口。您应该使用 webdriver waits 来确保您的窗口也已打开。

您可以做的另一件事可以使您的测试更加安全,那就是使用等待元素弹出。

wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR,"something")))

最后,如果您尝试单击 except 中的值但它们失败了,最好将其全部放入 try 然后捕获异常。

进口:

from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait 
from selenium.webdriver.support import expected_conditions as EC

【讨论】:

输入 id 和密码绝对有效!!但在我的情况下,弹出用于检查人的安全身份验证..ㅠㅠ

以上是关于如何使用 selenium 在某些网站中使用 kakao、google、naver id 自动登录的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Selenium 从亚马逊上的自动建议中“点击”某些建议?

在 Selenium python 中包含某些文本的其他 div 中选择某些 div 的方法

如何使用Selenium和Python在网站内的页面中导航?

如何在 python 中使用 Selenium 和 Beautifulsoup 解析网站? [关闭]

如何使用 Selenium Web 驱动程序检测 Windows 身份验证提示?

在使用 Selenium 的某些元素之后通过 CSS 选择器查找元素