Python Selenium通过Gmail自动登录Indeed的问题求助
问题描述
- 使用Python Selenium通过Gmail账号自动登录Indeed时,普通Firefox/Chrome Driver会触发Google安全检测,提示:
无法登录。此浏览器或应用可能不安全
- 改用
undetected_chromedriver规避检测后,又出现NoSuchElementException,无法找到“Continue with Google”按钮。
普通Driver代码示例:
login_url='https://secure.indeed.com/auth?hl=en_US&co=US&continue=https%3A%2F%2Fwww.indeed.com%2F&tmpl=desktop&service=my&from=gnav-util-homepage&jsContinue=https%3A%2F%2Fwww.indeed.com%2F&empContinue=https%3A%2F%2Faccount.indeed.com%2Fmyaccess&_ga=2.36143904.1242603427.1673200412-1007460264.1673200412' driver = webdriver.Firefox(options=options, capabilities=caps, service=serv) # driver = uc.Chrome() # driver.delete_all_cookies() driver.get(login_url) time.sleep(4) window_before = driver.window_handles[0] google = driver.find_element(By.XPATH,'//*[@id="login-google-button"]') google.click() time.sleep(4) window_after = driver.window_handles[1] driver.switch_to.window(window_after) emailBox = driver.find_element(By.XPATH,"//input[@type='email']") emailBox.send_keys('email@gmail.com') emailBox.send_keys(Keys.ENTER) time.sleep(7) driver.get_screenshot_as_file("screenshot.png") # passwordBox = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH,"//input[@type='password']"))) passwordBox = driver.find_element(By.XPATH,"//input[@type='password']") passwordBox.send_keys('password') passwordBox.send_keys(Keys.ENTER) time.sleep(7) driver.switch_to.window(window_before)
undetected_chromedriver代码示例:
login_url='https://secure.indeed.com/auth?hl=en_US&co=US&continue=https%3A%2F%2Fwww.indeed.com%2F&tmpl=desktop&service=my&from=gnav-util-homepage&jsContinue=https%3A%2F%2Fwww.indeed.com%2F&empContinue=https%3A%2F%2Faccount.indeed.com%2Fmyaccess&_ga=2.36143904.1242603427.1673200412-1007460264.1673200412' driver = uc.Chrome() # driver.delete_all_cookies() wait = WebDriverWait(driver, 5) test = driver.get(login_url) time.sleep(4) window_before = driver.window_handles[0] try: driver.find_element(By.XPATH, '//*[@id="login-google-button"]').click() except NoSuchElementException: print("No Such Element Exception")
解决方案
1. 修复元素定位问题
- 修正XPATH转义引号:代码中
"是HTML转义字符,直接替换为普通引号即可,正确XPATH应为'//*[@id="login-google-button"]'或"//*[@id='login-google-button']",避免解析错误。 - 用显式等待替代固定sleep:固定sleep稳定性差,改用
WebDriverWait等待元素可点击,确保页面完全加载:from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.common.by import By wait = WebDriverWait(driver, 10) google_btn = wait.until(EC.element_to_be_clickable((By.ID, "login-google-button"))) google_btn.click() - 处理Cookie同意弹窗:Indeed登录页可能有Cookie授权弹窗,需先关闭:
try: cookie_accept = wait.until(EC.element_to_be_clickable((By.XPATH, "//button[contains(text(),'Accept All')]"))) cookie_accept.click() except: pass # 若没有弹窗则跳过
2. 优化undetected_chromedriver配置
添加启动选项增强隐身性,避免被网站检测:
import undetected_chromedriver as uc from selenium.webdriver.chrome.options import Options options = Options() options.add_argument("--disable-blink-features=AutomationControlled") options.add_experimental_option("excludeSwitches", ["enable-automation"]) options.add_experimental_option('useAutomationExtension', False) options.add_argument("--start-maximized") # 最大化窗口,避免元素因窗口过小隐藏 driver = uc.Chrome(options=options)
3. 完整可运行代码
import undetected_chromedriver as uc from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.common.keys import Keys login_url = 'https://secure.indeed.com/auth?hl=en_US&co=US&continue=https%3A%2F%2Fwww.indeed.com%2F&tmpl=desktop&service=my&from=gnav-util-homepage&jsContinue=https%3A%2F%2Fwww.indeed.com%2F&empContinue=https%3A%2F%2Faccount.indeed.com%2Fmyaccess&_ga=2.36143904.1242603427.1673200412-1007460264.1673200412' # 配置undetected_chromedriver options = uc.ChromeOptions() options.add_argument("--disable-blink-features=AutomationControlled") options.add_experimental_option("excludeSwitches", ["enable-automation"]) options.add_experimental_option('useAutomationExtension', False) options.add_argument("--start-maximized") driver = uc.Chrome(options=options) wait = WebDriverWait(driver, 15) try: driver.get(login_url) # 处理Cookie弹窗 try: cookie_btn = wait.until(EC.element_to_be_clickable((By.XPATH, "//button[contains(text(), 'Accept All')]"))) cookie_btn.click() except: pass # 等待并点击Google登录按钮 google_btn = wait.until(EC.element_to_be_clickable((By.ID, "login-google-button"))) google_btn.click() # 切换到Google登录窗口 wait.until(lambda d: len(d.window_handles) > 1) driver.switch_to.window(driver.window_handles[1]) # 输入邮箱 email_box = wait.until(EC.element_to_be_clickable((By.XPATH, "//input[@type='email']"))) email_box.send_keys('your_email@gmail.com') email_box.send_keys(Keys.ENTER) # 输入密码 password_box = wait.until(EC.element_to_be_clickable((By.XPATH, "//input[@type='password']"))) password_box.send_keys('your_password') password_box.send_keys(Keys.ENTER) # 切换回Indeed窗口 wait.until(lambda d: len(d.window_handles) == 1) driver.switch_to.window(driver.window_handles[0]) print("登录成功") except Exception as e: print(f"错误: {str(e)}") driver.get_screenshot_as_file("error_screenshot.png") finally: # 关闭浏览器 driver.quit()
额外注意事项
- 确保
undetected_chromedriver版本与本地Chrome版本匹配,避免兼容性问题。 - 若仍遇到Google安全验证,可尝试添加常用用户代理,或使用已登录的Chrome用户数据目录(需配置
options.add_argument(r"user-data-dir=C:\Users\YourUser\AppData\Local\Google\Chrome\User Data")),但注意多线程冲突。
内容的提问来源于stack exchange,提问作者Gopal Chitalia
相关产品推荐
相关产品推荐

