如何使用Python Selenium点击Discord登录页的Login按钮

问题背景
定位Discord登录页面的登录按钮时存在两个阻碍:
- 元素class属性值每次会话随机生成,无法通过class属性稳定定位
- 按钮无固定ID,常规ID定位方式失效
目前已经实现邮箱、密码输入框的文本填入逻辑,需要补充稳定的登录按钮点击能力,现有代码如下:
import selenium from selenium import webdriver from selenium.webdriver.common.keys import Keys from selenium.webdriver.common.by import By driver = webdriver.Chrome(r"C:/Users/sexyv/Downloads/chromedriver_win32/chromedriver.exe") driver.get("https://discord.com/login") email_box = driver.find_element(by=By.NAME, value="email") password_box = driver.find_element(by=By.NAME, value="password") submit_button = driver.find_element(by=By.ID, value="login-button") def login(driver, email_box, password_box): driver.implicitly_wait(3) driver.implicitly_wait(5) email_box.send_keys("johnsonkalel15@gmail.com") password_box.send_keys("Kalel12345shjd") login(driver=driver,email_box=email_box, password_box=password_box)
修复方案
现有代码存在3个明显问题:
- 隐式等待配置位置错误:
implicitly_wait是webdriver的全局配置,初始化driver后设置一次即可,无需重复调用,更不应该放在登录函数内 - 元素查找时机过早:页面刚触发跳转就立刻查找DOM元素,此时页面元素还未渲染完成,很容易抛出找不到元素的异常
- 缺少提交动作:填充完账号密码后没有触发按钮点击,也没有做表单提交
可以用两种稳定的方式实现登录提交,完全不受动态class、随机ID影响:
- 方案1:通过固定的按钮属性+文本定位,Discord登录按钮的
type属性固定为submit,按钮文本固定为登录相关文案,用XPath即可稳定匹配 - 方案2:密码输入完成后直接触发回车事件,表单默认会触发提交逻辑,不需要额外定位按钮
修正后的完整代码如下:
import selenium from selenium import webdriver from selenium.webdriver.common.keys import Keys from selenium.webdriver.common.by import By driver = webdriver.Chrome(r"C:/Users/sexyv/Downloads/chromedriver_win32/chromedriver.exe") # 全局设置隐式等待,最多等待10秒等待元素加载 driver.implicitly_wait(10) driver.get("https://discord.com/login") def login(driver, email, password): # 等待元素加载完成后再查找输入框 email_box = driver.find_element(by=By.NAME, value="email") password_box = driver.find_element(by=By.NAME, value="password") email_box.clear() email_box.send_keys(email) password_box.clear() password_box.send_keys(password) # 方式1:通过固定属性+文本定位登录按钮点击 submit_btn = driver.find_element(by=By.XPATH, value='//button[@type="submit" and normalize-space(text())="Log In"]') submit_btn.click() # 不想定位按钮可以直接用方式2:密码框输入完按回车提交 # password_box.send_keys(Keys.ENTER) login(driver=driver, email="johnsonkalel15@gmail.com", password="Kalel12345shjd")
补充说明:如果遇到按钮点击不生效的情况,可以加一步判断按钮可点击状态的显式等待,比隐式等待的判断逻辑更精准。
内容的提问来源于stack exchange,提问作者Anonymous
相关产品推荐
相关产品推荐

