金天牛

导航

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)

posted on 2025-04-30 17:24  金天牛  阅读(204)  评论(0)    收藏  举报