selenium的text方法获取不了标签中的文本之原因分析
一、现象
现象:
通过driver.find_element(By.XPATH, "//div[@class='-category']").text 方法获取的文本值为空,元素可以定位到,但获取不了值。
二、原因分析
原因1。
当前元素可能因页面未完全加载而不可见
原因2.
当前定位的元素可能被隐藏了,由于webdriver spec的定义,Selenium WebDriver 只会与可见元素交互,所以获取隐藏元素的文本总是会返回空字符串。原因3.
原因3.
当前元素可能是在iframe中
原因4.
当前元素在页面抓取时没有没有展示出来,需要滑动到元素出现。
原因5.
当前元素可能被其他元素覆盖:
三、排查过程
排查1. 查看运行过程中,页面是否加载完成。
比如通过当前页面截图来查看实际运行时的样式:driver.get_screenshot_as_file(pic_name)
排查2.通过 element_state = driver.find_element(By.XPATH, "//div[@class='-category']").is_displayed() 确定元素是否被隐藏了,如果element_state 得到 False的结果.那就说明被隐藏了,True则说明正常,则继续。
排查3. 查找iframe,看此元素是否在iframe中
排查4. 查看运行时,当前元素是否在所在窗口展示出来。如果定位的元素在当前窗口没有展示,则需要滑动窗口,让元素展示出来,再去获取。
排查5.查看运行过程中,是否被其他元素覆盖了。
四、解决办法
解决1. 如果页面未加载完成,使用显示等待。
方法:element = WebDriverWait(driver, 10).until(EC.visibility_of_element_located((By.XPATH, "//div[@class='-category']")))
或者 WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH, "//div[@class='-category']")))
解决2. 如果元素不可见
方法1: 修改页面当前定位元素,或者当前元素父元素的CSS,使元素的is_displayed() 值为true.
当元素被 display: none 或 visibility: hidden 隐藏时
driver.execute_script("arguments[0].style.display = 'block';", element)
driver.execute_script("arguments[0].style.visibility = 'visible';", element)
方法2:is_displayed() 为false的元素,依然可以通过getAttribute()方法获取元素的属性。通过textContent, innerText, innerHTML等属性去获取
例如:driver.find_element(By.XPATH, "//div[@class='-category']").get_attribute('innerText')
解决3. 如果元素在iframe中
方法:通过先切换到对应的iframe中,再去定位元素。
driver.switch_to.frame('login_frame')
driver.switch_to.default_content()
解决4:记得启动浏览器时,先把浏览器放大,然后去滑动窗口到指定元素位置:
driver.maximize_window() #放大浏览器
element = driver.find_element(By.XPATH, "//div[@class='-category']") #定位到需要看到的元素
driver.execute_script("arguments[0].scrollIntoView();",element) #滑动到元素出现
解决5:如果被其他元素遮挡,则可以先操作被遮挡的元素,比如元素收回,比如关闭弹窗等
比如移除广告弹窗:
driver.execute_script("""
if(document.body.contains(arguments[0])) {
arguments[0].remove();
}
""", element)
浙公网安备 33010602011771号