Python 中的 Selenium:按钮元素在与 reCAPTCHA 交互后似乎消失了。世界卫生大会?

Selenium in Python: button element seems to vanish after interacting with reCAPTCHA. wha?

我正在尝试与需要输入用户名和密码的页面进行交互,然后需要单击 reCAPTCHA,然后单击登录按钮。输入用户名和密码并单击 reCAPTCHA 工作正常,但在与 reCAPTCHA 交互后,Selenium 似乎无法找到登录按钮元素。问题是,Selenium before 交互 reCAPTCHA 很容易找到登录按钮元素。怎么回事?

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

driver = webdriver.Firefox()
driver.get("https://localbitcoins.com/accounts/login/")
time.sleep(2)
element = driver.find_element_by_name("username")
element.send_keys("username")
element = driver.find_element_by_name("password")
element.send_keys("passcode")
time.sleep(1)
# reCAPTCHA
wait(driver, 10).until(EC.frame_to_be_available_and_switch_to_it(driver.find_element_by_xpath('//iframe[contains(@src, "google.com/recaptcha")]')))
wait(driver, 10).until(EC.element_to_be_clickable((By.ID, "recaptcha-anchor"))).click()
# login button
elements = driver.find_elements_by_xpath("//button[contains(text(), 'Login')]")
elements[0].click()

为了能够处理 "Login" 按钮,您必须在与它交互后从 iframe 切换回来:

# reCAPTCHA
wait(driver, 10).until(EC.frame_to_be_available_and_switch_to_it(driver.find_element_by_xpath('//iframe[contains(@src, "google.com/recaptcha")]')))
wait(driver, 10).until(EC.element_to_be_clickable((By.ID, "recaptcha-anchor"))).click()

# Switch to default content
driver.switch_to.default_content()

# login button
elements = driver.find_elements_by_xpath("//button[contains(text(), 'Login')]")
elements[0].click()

P.S。注意在wait(driver, 10)之前不需要使用time.sleep(1)。如果您需要更多时间等待 - 只需增加超时时间,例如wait(driver, 15)