使用Python Selenium操作CareCredit申请页元素定位失败求助
问题:Python Selenium无法定位carecredit申请页的SSN后四位和手机号输入框
使用Python Selenium操作https://www.carecredit.com/apply/页面,选择职业并点击进入后,页面提示输入SSN后四位和手机号,但始终无法找到对应元素,怀疑元素是否存在。
所用代码
driver3 = webdriver.Chrome(options=chrome_options) driver3.get('https://www.carecredit.com/apply/') # 选择职业 carecategory = Select(driver3.find_element(By.ID, 'profession-apply')) carecategory.select_by_visible_text('Other') # 点击开始申请 carestarted = driver3.find_element(By.XPATH , '//*[@id="ApplyForm"]/input[28]') driver3.execute_script("arguments[0].click();", carestarted) # 定位SSN后四位输入框 carelast4 = driver3.find_elements(By.XPATH, '//*[@id="pfLandinglast4SSN"]') carelast4.send_keys(ssn3) # 定位手机号输入框 carephone1 = driver3.find_elements(By.XPATH, 'pfLandingMobileNo') carephone1.send_keys(phone) # 点击继续 carecontinue = driver3.find_element(By.XPATH, '//*[@id="payfoneSubmitbtn"]') driver3.execute_script("arguments[0].click();", carecontinue) driver3.implicitly_wait(10)
报错信息
Traceback (most recent call last): File "C:\Users\dee\PycharmProjects\pythonProject2\main.py", line 671, in <module> carelast4 = driver3.find_elements(By.XPATH, '//*[@id="pfLandinglast4SSN"]') ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "C:\Users\dee\PycharmProjects\pythonProject2\venv\Lib\site-packages\selenium\webdriver\remote\webdriver.py", line 860, in find_elements return self.execute(Command.FIND_ELEMENTS, {"using": by, "value": value})["value"] or [] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "C:\Users\dee\PycharmProjects\pythonProject2\venv\Lib\site-packages\selenium\webdriver\remote\webdriver.py", line 438, in execute response = self.command_executor.execute(driver_command, params) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "C:\Users\dee\PycharmProjects\pythonProject2\venv\Lib\site-packages\selenium\webdriver\remote\remote_connection.py", line 290, in execute return self._request(command_info[0], url, body=data) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "C:\Users\dee\PycharmProjects\pythonProject2\venv\Lib\site-packages\selenium\webdriver\remote\remote_connection.py", line 311, in _request response = self._conn.request(method, url, body=body, headers=headers) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "C:\Users\dee\PycharmProjects\pythonProject2\venv\Lib\site-packages\urllib3\request.py", line 78, in request return self.request_encode_body( ^^^^^^^^^^^^^^^^^^^^^^^^^ File "C:\Users\dee\PycharmProjects\pythonProject2\venv\Lib\site-packages\urllib3\request.py", line 170, in request_encode_body return self.urlopen(method, url, **extra_kw) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "C:\Users\dee\PycharmProjects\pythonProject2\venv\Lib\site-packages\urllib3\poolmanager.py", line 376, in urlopen response = conn.urlopen(method, u.request_uri, **kw) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "C:\Users\dee\PycharmProjects\pythonProject2\venv\Lib\site-packages\urllib3\connectionpool.py", line 703, in urlopen httplib_response = self._make_request( ^^^^^^^^^^^^^^^^^^^ File "C:\Users\dee\PycharmProjects\pythonProject2\venv\Lib\site-packages\urllib3\connectionpool.py", line 449, in _make_request six.raise_from(e, None) File "<string>", line 3, in raise_from File "C:\Users\dee\PycharmProjects\pythonProject2\venv\Lib\site-packages\urllib3\connectionpool.py", line 444, in _make_request httplib_response = conn.getresponse() ^^^^^^^^^^^^^^^^^^ File "C:\Program Files\Python311\Lib\http\client.py", line 1376, in getresponse self.close() File "C:\Program Files\Python311\Lib\http\client.py", line 953, in close def close(self): KeyboardInterrupt
解决建议
- 检查iframe:这类验证模块通常嵌入在iframe中,Selenium无法直接定位iframe内元素,需先切换:
# 替换为实际iframe的定位方式,比如通过src包含payfone来定位 iframe = driver3.find_element(By.XPATH, "//iframe[contains(@src, 'payfone')]") driver3.switch_to.frame(iframe) # 之后再定位SSN和手机号元素 - 替换
find_elements为find_element:find_elements返回元素列表,无法直接调用send_keys,需用find_element获取单个元素 - 修正手机号定位语法:原XPATH
'pfLandingMobileNo'缺少前缀,正确写法为'//*[@id="pfLandingMobileNo"]',或直接用By.ID更可靠:carephone1 = driver3.find_element(By.ID, "pfLandingMobileNo") - 用显式等待替代隐式等待:显式等待精准等待元素可见,避免页面未加载完成就查找:
from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC # 等待SSN输入框可见 carelast4 = WebDriverWait(driver3, 10).until( EC.visibility_of_element_located((By.ID, "pfLandinglast4SSN")) ) carelast4.send_keys(ssn3) - 确认元素属性正确性:用浏览器F12开发者工具实时查看元素,确认ID是否为
pfLandinglast4SSN和pfLandingMobileNo,避免页面动态生成属性导致定位失败
内容的提问来源于stack exchange,提问作者thrvxx
相关产品推荐
相关产品推荐

