我在尝试自动提交包含 Cloudflare Turnstile CAPTCHA 的表单时遇到了 SeleniumBase 的问题。等待 7 秒后尝试查找 iframe 元素时,脚本失败并出现 NoSuchElementException。
https://github.com/seleniumbase/SeleniumBase/blob/master/examples/raw_form_turnstile.py
from seleniumbase import SB
with SB(uc=True, test=True) as sb:
url = "seleniumbase.io/apps/form_turnstile"
sb.uc_open_with_reconnect(url, 2)
sb.press_keys("#name", "SeleniumBase")
sb.press_keys("#email", "[email protected]")
sb.press_keys("#phone", "1-555-555-5555")
sb.click('[for="date"]')
sb.click("td.is-today button")
sb.click('div[class="select-wrapper"] input')
sb.click('span:contains("9:00 PM")')
sb.highlight_click('input[value="AR"] + span')
sb.click('input[value="cc"] + span')
sb.scroll_to("iframe")
sb.uc_gui_handle_cf()
sb.highlight("img#captcha-success", timeout=3)
sb.highlight_click('button:contains("Request & Pay")')
sb.highlight("img#submit-success")
sb.highlight('button:contains("Success!")')
错误消息 I我得到的是:
seleniumbase.common.exceptions.NoSuchElementException: Message: Element {iframe} was not present after 7 seconds!
任何有关如何使用 Cloudflare 的 Turnstile CAPTCHA 处理此 iframe 问题的见解或建议,我们将不胜感激!
该错误消息表明,在 SeleniumBase 示例中指定的时间段(7 秒)内,无法在页面上找到
iframe
元素。这表明该页面本身的加载速度可能比预期慢,或者
iframe
元素的加载速度比主 HTML 内容慢。
以下是如何解决此问题的几种方法:
- 增加超时时间:
最简单的解决方案是增加
sb.uc_gui_handle_cf()
函数的等待时间。这将为页面加载
iframe
元素提供更多时间。可以通过修改如下所示的代码行来实现这一点:
python
sb.uc_gui_handle_cf(timeout=15)
这会将等待时间增加到 15 秒。根据的网络连接和页面的加载时间调整该值。
- 等待特定的 iframe 元素:
与其仅仅等待一个通用的
iframe
,不如等到包含 Cloudflare Turnstile challenge 的特定
iframe
出现。可以通过检查页面的 HTML 源代码并查找包含 challenge 的
iframe
来实现这一点。找到后,使用 SeleniumBase 的等待功能之一,例如
wait_for_element_present()
或
wait_for_element_visible()
,直到
iframe
可用。
例如,如果
iframe
有一个唯一的 ID:
python
sb.wait_for_element_present("#cf-turnstile-iframe", timeout=10)
sb.uc_gui_handle_cf()
- 调查 Cloudflare Turnstile 的延迟加载:
Cloudflare Turnstile 可能使用延迟加载技术,该技术仅在需要时才加载 challenge。这意味着在满足某些条件之前,
iframe
元素可能不会立即存在于页面源代码中。要解决此问题,需要确定触发 Turnstile 加载的操作,并使用 SeleniumBase 模拟该操作。这可能涉及滚动到页面上的特定位置,将鼠标悬停在某个元素上或与表单交互。
例如,如果 Turnstile 在提交按钮可见时加载:
python
submit_button = sb.find_element('button:contains("Request & Pay")')
sb.scroll_to(submit_button)
sb.uc_gui_handle_cf()
- 禁用 Cloudflare Turnstile(测试目的):
如果正在测试环境中工作,则可以考虑暂时禁用 Cloudflare Turnstile。这将允许在不处理 CAPTCHA 的情况下自动执行测试。 请记住,在生产环境中启用 Cloudflare Turnstile 非常重要,以防止滥用行为。
请记住,自动绕过 Cloudflare Turnstile 等安全措施可能会违反其服务条款。始终优先考虑道德测试实践,并在生产环境中保留安全措施。
标签:python,selenium-webdriver,seleniumbase,cloudflare-turnstile From: 78773882