• 动态加载元素可以这样获取


    昨天遇到了一个问题,在京东页面,元素是动态加载的,这个怎么获取呢?

    今天总结下这个动态加载的元素获取

    因为京东这个网页东西太多,元素也有很多,所以处理的为动态加载,何为动态加载呢?也就是说,滑动到可视区域后才会加载。那么有人可能会有疑问说什么是可视区域呢?

    看图说话:

     整个红框就可以看成是可视区域,也就是说只有在这个可视区域里面元素才会加载

    定位的是可视区域下面的元素,直接不经过处理就直接点击的话肯定会报错,引用显示等待的不经过下拉滚动条也会报超时的错误

    但是如果拉动滚动条的话又不知道拉多少,这可真是个问题呢

    昨天中午花了点时间解决了下,下面写写我的解决思路吧

    1、首先确认下我们的可视区域有多大?

    2、我们一点一点的滑动这个滚动条,让元素都加载出来,找到我们的元素之后就跳出循环。

    好了,既然已经确定了我们的思路了,那就直接上代码吧,以下代码是保证这个元素在dom里面,不然会陷入死循环

    from selenium import webdriver
    
    from selenium.webdriver.common.by import By
    from selenium.webdriver.common.keys import Keys
    from selenium.webdriver.support import expected_conditions as EC
    from selenium.webdriver.support.wait import WebDriverWait
    
    driver = webdriver.Chrome()
    driver.get('http://www.baidu.com')
    driver.implicitly_wait(5)
    driver.maximize_window()
    ele = driver.find_element_by_id('kw')
    ele.send_keys("京东商城", Keys.ENTER)
    loc = (By.XPATH, '//a[contains(text(),"正品低价、品质保障")]')
    WebDriverWait(driver, 20).until(EC.visibility_of_element_located(loc))
    driver.find_element(*loc).click()
    win = driver.window_handles
    driver.switch_to.window(win[-1])
    lo = (By.XPATH, '//h3[text()="逛好店"]')
    
    while True:
        js = """
                var a = window.innerHeight;
                window.scrollBy(0, a*0.5);
        """
        driver.execute_script(js)
        try:
            WebDriverWait(driver, 3, 0.5).until(EC.visibility_of_element_located(lo))
            driver.find_element(*lo).click()
        except:
            pass
        else:
            break

    是不是很简单,只是加了一个while循环,这种是简单版本的,复杂版本的就类似于要去计算整个滚动条,我需要去滑动多少次才能滑动到底,感觉还是直接写一个死循环吧,达到条件就直接退出。

  • 相关阅读:
    java注解
    SpringBoot 整合 MybatisPlus 3.0
    第三章 列表简介
    第二章 变量及简单数据类型
    收藏通俗知识
    2017.8.13 列标,元组,字符串
    Python入门--4--分之和循环
    Python入门---易错已错易混淆----知识点
    Perl语言入门--4--函数
    perl学习之精髓中的精髓
  • 原文地址:https://www.cnblogs.com/LCboss/p/11949410.html
Copyright © 2020-2023  润新知