Python中selenium爬取淘宝流量充值页面时输入手机号出现问题,请问如何解决?

对应的元素名字是:

<input id="J_phone" type="text" name="_fm.ecard._0.m" value="" class="ipt tel-input" maxlength="11" autocomplete="off">

代码是这样的:

driver.find_element_by_id('J_phone').send_keys('手机号 xxx')

但是这个位置什么东西也没有写进去, 请问这个问题如何处理:

pic

似乎没有找到那个元素: 然后出现问题。

pic

J__LinkBuy 是购买的链接, 点击之后跳转到新的页面

pic

这个是相对完整的代码:

element=WebDriverWait(driver,60).until(lambda driver :
driver.find_element_by_css_selector('#J_LinkBuy'))

element.click() time.sleep(5)

driver.find_element_by_id(‘J_phone’).send_keys(d[‘phone’])


Python中selenium爬取淘宝流量充值页面时输入手机号出现问题,请问如何解决?

18 回复

不要用 time.sleep(5),要等到那个元素 clickable 时再 send_keys


遇到这个问题,大概率是手机号输入框有特殊的交互逻辑。淘宝这类页面经常用动态加载或者框架,直接send_keys可能不生效。试试下面这个方案,重点是用WebDriverWait等元素真正可交互,并且先执行点击操作再输入。

from selenium import webdriver
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.common.exceptions import TimeoutException

# 启动浏览器,建议用Chrome
driver = webdriver.Chrome()
driver.get("https://recharge.taobao.com") # 替换成实际目标页面

try:
    # 1. 显式等待输入框出现,这里用CSS选择器示例,你需要根据实际页面调整
    # 常见的可能是 <input type="tel" placeholder="请输入手机号码">
    phone_input = WebDriverWait(driver, 10).until(
        EC.presence_of_element_located((By.CSS_SELECTOR, "input[type='tel'], input[placeholder*='手机']"))
    )
    
    # 2. 先点击一下输入框,确保获得焦点
    phone_input.click()
    
    # 3. 清空可能存在的默认值,然后输入你的手机号
    phone_input.clear()
    phone_input.send_keys("13800138000") # 替换成你要充值的手机号
    
    print("手机号输入成功!")
    
except TimeoutException:
    print("错误:在指定时间内没找到手机号输入框。检查选择器或页面加载状态。")
except Exception as e:
    print(f"发生其他错误:{e}")
finally:
    # driver.quit() # 调试时可先注释,查看页面状态
    pass

关键点:

  1. 选择器要对:用浏览器开发者工具(F12)检查手机输入框的idnameclass,替换上面的CSS_SELECTOR。如果输入框在iframe里,需要先用driver.switch_to.frame切换进去。
  2. 等元素准备好presence_of_element_located是等元素出现在DOM里,如果页面有动画,可以改用EC.element_to_be_clickable
  3. 先点击再输入:有时候直接send_keys会失败,先click()一下能触发事件,让输入框进入可输入状态。

一句话总结:用显式等待定位元素,并确保先点击获得焦点后再输入。

为啥要自动化操作

五秒已经够了, 足够加载出来了
代码改成这样会有这个问题:

<br>element=WebDriverWait(driver,60).until(lambda driver :<br>driver.find_element_by_css_selector('#J_LinkBuy'))<br>
![pic]( http://7xpvdr.com1.z0.glb.clouddn.com/1001123700.png
)

懒得点那么多按键。 ~~ 顺便学学 selenium

应该不是同一个 frame, 你将 selenium 里那个源码打出来查一下, 另外 chrome 里调试 console 里选 top 层

您好您指的是那个源码? 能指导一下吗, 我可以付费的。


Driver 里打出来应该和 chrome 里加载后的源码是一致的,你查一下 iframe 应该就能看到了

你好请问有没有好的解决办法~ 我可以付费解决

#9 https://stackoverflow.com/questions/37687149/how-to-switch-to-iframe-in-selenium
我来拿赏金,这里讲了如何切换到 iframe 的方法

没用过 selenium 不过看你这个描述,像是往里写的时候元素还没有加载出来吧。这里面能写判断和 console 吗。能的话先跑个定时器试试能不能出来这个元素不就解决了?



一般用了 selenium 都找不到的元素,就是页面在其他 iframe 里面。

你看看之前的一个旧帖,结合其他答案,就知道如何切换 iframe 了。

https://www.v2ex.com/t/358770#reply8

估计是 iframe 问题

甩个网页链接呗


建议用 pycharm 下断点调试,调试时,可以单独执行 代码块
或者 使用 selenium 的浏览器插件

selenium 是可以打印截图的 打印截图之后 你看看有没有那个输入框。


运行了一下,你的这个代码是可以的!
你的 cookie 是怎么处理的?

应该不是 iframe 的问题因为整个页面的内容都没有

回到顶部