Selenium(Python)无name/id定位时如何输入邮编并提交表单
Selenium无id/name属性时定位表单元素实现邮编输入与提交
对应页面源码
<div class="container-fluid" id="basicpage"> <div class="container"> <div class="row"> <div id=right_col class="col-xs-12 col-md-9"> <div class=nothingwrapper></div> <div class=nothingwrapper> <h1>Postcode Snapshot </h1> <p> Please type in the postcode for which you would like to download a postcode snapshot:</p> <form action="postcodesnapshotchoosepostcode.php" method="post"> <input name=sub value=1 type=hidden> <p><input type="text" name=postcode size=5></p> <p><input type=submit value='Continue' /></p> </form> <p> </p> </div> </div> </div> </div> </div>
原有代码的问题
- 定位目标错误:
name="sub"的是表单内置的隐藏传参字段,不是用户可见可点击的Continue提交按钮,对这个元素做提交操作不符合交互逻辑 - 语法错误:
By.NAME是定位策略枚举值,find_element的正确传参格式是find_element(定位策略, 定位值),不能写成By.NAME("sub")的调用形式
实现方案
当元素没有可用的id、name属性时,优先用CSS选择器或XPath,结合元素标签、其他属性、层级关系完成定位,配合显式等待避免页面未渲染完成的定位失败问题,完整代码如下:
from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC # 初始化等待对象,最长等待10秒直到元素可交互 wait = WebDriverWait(driver, 10) # 定位邮编输入框:匹配表单下type为text的输入框,清空后输入3000 # 如果postcode的name属性也不可用,可以把定位规则改成匹配size=5的text类型input postcode_input = wait.until(EC.element_to_be_clickable( (By.CSS_SELECTOR, "form input[type='text'][name='postcode']") )) postcode_input.clear() postcode_input.send_keys("3000") # 定位提交按钮:匹配表单下value为Continue的submit类型按钮,点击提交 submit_btn = wait.until(EC.element_to_be_clickable( (By.CSS_SELECTOR, "form input[type='submit'][value='Continue']") )) submit_btn.click()
其他可选写法
- 如果不想单独定位提交按钮,输入完邮编后直接调用
postcode_input.submit(),会自动触发输入框所属表单的提交逻辑,效果和点提交按钮一致 - 不习惯用CSS选择器的话,也可以换XPath定位:
- 邮编输入框XPath:
//p/input[@type='text' and @size='5'] - 提交按钮XPath:
//input[@type='submit' and @value='Continue']
- 邮编输入框XPath:
注意:不要对隐藏元素做点击、输入这类交互操作,Selenium本身会拦截对不可见元素的交互请求,直接抛异常。
内容的提问来源于stack exchange,提问作者TSH
相关产品推荐
相关产品推荐

