Python浏览器文本框值获取问题:.text与innerHTML返回空
问题:Selenium获取输入框值为空的解决方法
功能说明
输入ID到指定输入框,获取目标输入框的对应值
问题代码
def pedido_valor(self): #carregando a planilha extravios = "extravios_01.xlsx" df = pd.read_excel(extravios) print(df) idpedido = self.driver.find_element("xpath",'//*[@id="__qiankun_subapp_wrapper_for_vue_service_quality_index__"]/div/div/div/div[1]/div/div/div[1]/div[1]/div[2]/div[2]/span[2]/div[1]/input') valornota = self.driver.find_element("xpath",'//*[@id="__qiankun_subapp_wrapper_for_vue_service_quality_index__"]/div/div/div/div[1]/div/div/div[1]/div[1]/div[2]/div[4]/span[2]/div[1]/input').get_attribute("innerHTML") #valornota = self.driver.find_element("xpath",'//*[@id="__qiankun_subapp_wrapper_for_vue_service_quality_index__"]/div/div/div/div[1]/div/div/div[1]/div[1]/div[2]/div[4]/span[2]/div[1]/input').text for index,row in df.iterrows(): idpedido.send_keys(str(row['ID'])) time.sleep(3) #valornota.click() time.sleep(2) clipboard.copy(str(valornota)) resposta = clipboard.paste() print(resposta) time.sleep(3) idpedido.clear()
遇到的问题
- 使用
.text方法获取文本框值时,输出为空 - 使用
.get_attribute("innerHTML")方法时,输出同样为空
解决方案
1. 改用get_attribute("value")获取输入框内容
输入框的实际值通常存储在value属性中,而非innerHTML或通过.text获取。另外你当前代码提前获取了valornota的属性,但此时目标输入框还未生成对应值,必须在输入ID、页面更新后重新定位元素并取值。
修改后代码:
def pedido_valor(self): # 加载表格 extravios = "extravios_01.xlsx" df = pd.read_excel(extravios) print(df) idpedido = self.driver.find_element("xpath",'//*[@id="__qiankun_subapp_wrapper_for_vue_service_quality_index__"]/div/div/div/div[1]/div/div/div[1]/div[1]/div[2]/div[2]/span[2]/div[1]/input') # 提前保存目标输入框的XPath,避免重复写长路径 valornota_xpath = '//*[@id="__qiankun_subapp_wrapper_for_vue_service_quality_index__"]/div/div/div/div[1]/div/div/div[1]/div[1]/div[2]/div[4]/span[2]/div[1]/input' for index,row in df.iterrows(): idpedido.send_keys(str(row['ID'])) time.sleep(3) # 输入ID后重新定位元素,获取value属性 valornota_element = self.driver.find_element("xpath", valornota_xpath) valornota = valornota_element.get_attribute("value") # 直接使用获取到的值,无需借助剪贴板 print(valornota) time.sleep(3) idpedido.clear()
2. 替换固定等待为显式等待
固定time.sleep()可靠性差,页面加载慢时会导致取值失败,建议改用Selenium显式等待,等待目标输入框的value属性非空:
from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC def pedido_valor(self): extravios = "extravios_01.xlsx" df = pd.read_excel(extravios) print(df) idpedido = self.driver.find_element("xpath",'//*[@id="__qiankun_subapp_wrapper_for_vue_service_quality_index__"]/div/div/div/div[1]/div/div/div[1]/div[1]/div[2]/div[2]/span[2]/div[1]/input') valornota_xpath = '//*[@id="__qiankun_subapp_wrapper_for_vue_service_quality_index__"]/div/div/div/div[1]/div/div/div[1]/div[1]/div[2]/div[4]/span[2]/div[1]/input' wait = WebDriverWait(self.driver, 10) for index,row in df.iterrows(): idpedido.send_keys(str(row['ID'])) # 等待目标输入框出现,且value属性不为空 valornota_element = wait.until(EC.presence_of_element_located(("xpath", valornota_xpath))) valornota = wait.until(lambda driver: valornota_element.get_attribute("value") != "") print(valornota) # 等待输入框清空完成 idpedido.clear() wait.until(lambda driver: idpedido.get_attribute("value") == "")
3. 检查元素定位有效性
由于页面使用了qiankun微前端框架,绝对XPath可能因页面结构变化失效,建议:
- 改用相对XPath定位,比如通过输入框的
placeholder、name等属性:# 假设目标输入框有placeholder="Valor da Nota" valornota_xpath = '//input[@placeholder="Valor da Nota"]' - 如果目标元素在iframe内,需先切换到iframe再定位:
iframe = self.driver.find_element("xpath", "//iframe[@id='目标iframe的ID']") self.driver.switch_to.frame(iframe) # 之后再执行元素定位操作
内容的提问来源于stack exchange,提问作者Arthur Ferreira
相关产品推荐
相关产品推荐

