Selenium无法获取地址输入后更新的元素文本问题求助
Selenium获取更新后总价问题的解决办法
我用Selenium开发爬虫,选品加入购物车后循环遍历不同城市、州、邮编,计算含运费税费的总价。输入地址后目标元素会更新为新总价,但用implicit wait、time.sleep()甚至刷新都只能拿到初始价格,element.text始终返回初始值。相关代码如下:
for item in c_s_z_list: cty = driver.find_element(By.CSS_SELECTOR, 'input[id="city"]') cty.clear() time.sleep(1) cty.send_keys(item[0]) dropdown1 = Select(driver.find_element(By.CSS_SELECTOR,'select[id="state"]')) dropdown1.select_by_visible_text(item[1]) zcode = driver.find_element(By.CSS_SELECTOR,'input[id="zip"]') zcode.clear() time.sleep(1) zcode.send_keys(item[2]) time.sleep(20) fpt = driver.find_element(By.CSS_SELECTOR,'span[class="order-wizard-cart-summary-grid-right"]') fp = fpt.text print(fp)
输入地址前后元素HTML会变化,但始终无法获取更新后的文本。
解决办法:
等待文本主动更新,替代固定sleep
用WebDriverWait等待目标元素的文本与初始值不同,避免固定sleep的不确定性:from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC # 先记录初始价格 initial_price = driver.find_element(By.CSS_SELECTOR,'span[class="order-wizard-cart-summary-grid-right"]').text # 输入地址操作... # 等待文本更新为非初始值 wait = WebDriverWait(driver, 30) updated_element = wait.until( EC.text_to_be_present_in_element( (By.CSS_SELECTOR,'span[class="order-wizard-cart-summary-grid-right"]'), initial_price, negate=True ) ) fp = updated_element.text print(fp)处理DOM重新渲染的情况
输入地址后页面可能重新生成了目标元素,原定位的是旧DOM节点。可以等待旧元素失效后重新定位:# 输入地址操作... wait = WebDriverWait(driver, 30) old_element = driver.find_element(By.CSS_SELECTOR,'span[class="order-wizard-cart-summary-grid-right"]') # 等待旧元素被移除DOM wait.until(EC.staleness_of(old_element)) # 重新定位新元素 fpt = driver.find_element(By.CSS_SELECTOR,'span[class="order-wizard-cart-summary-grid-right"]') fp = fpt.text print(fp)触发页面更新事件
部分页面需要触发输入框的change事件或按键操作才会更新总价,比如输入邮编后按Tab或手动触发事件:from selenium.webdriver.common.keys import Keys zcode.send_keys(item[2]) # 按下Tab触发页面计算 zcode.send_keys(Keys.TAB) # 或用JS触发change事件 driver.execute_script("arguments[0].dispatchEvent(new Event('change'));", zcode)直接读取DOM属性值
若element.text无法获取更新后内容,尝试直接读取元素的innerText或textContent:fpt = driver.find_element(By.CSS_SELECTOR,'span[class="order-wizard-cart-summary-grid-right"]') fp = driver.execute_script("return arguments[0].innerText;", fpt) # 或者 # fp = driver.execute_script("return arguments[0].textContent;", fpt) print(fp)
内容的提问来源于stack exchange,提问作者PeterFonteneau
相关产品推荐
相关产品推荐

