语言:Python
京东商城想要找到某个未加载出的元素,需要将页面加载出来。
使用js实现
流程:
1. 需要引入包:
# 引入需要的包 import time 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
2. 创建浏览器对象等
# 创建浏览器对象 driver = webdriver.Chrome() url = "http://www.baidu.com" driver.get(url) # 窗口最大化 driver.maximize_window()
3. 定位京东商城网站,点击等操作
# 等待搜索框元素出现,使用显性等待 loc = (By.ID, ‘kw‘) WebDriverWait(driver, 20).until(EC.visibility_of_element_located(loc)) # 定位、点击元素操作,需要使用等待 jd_link = driver.find_element_by_id("kw") jd_link.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]) ”“” win = driver.window_handles driver.switch_to.window(win[-1]) # 需要根据实际的窗口尺寸,来决定每次滚动距离,所以需要获取实际窗口尺寸 # window.outerHeight:包含工具栏和滚动条 # window.innerHeight:不包含工具栏和滚动条,仅内容可视区域 lo = (By.XPATH, ‘//*[@id="J_top"]/div[1]/a/h3‘) # 获取当前窗口宽高: get_window_size()方法 win_size = driver.get_window_size() # 获取当前窗口内容可视区,execute_script()方法 inner_height = driver.execute_script(" var a = window.innerHeight; return a; ") print("当前窗口的内容可视区域-高度:",inner_height) # 获取当前整个html页面的body高度。 body_height = driver.execute_script(" var a = document.body.scrollHeight; return a; ") print("当前整个html页面的body-高度:",body_height)
4. 不断向下滑动,直至找到目标元素
# 创建目标高度 scrolled_height = 0 new_body_height = body_height old_body_height = 0 break_flag = False # 循环操作,直至找到目标元素 while new_body_height != old_body_height: distance = int((new_body_height -scrolled_height)/ (inner_height * 0.5)) + 1 for i in range(distance): # 滚动距离为 窗口内容可视区域的百分之50.可灵活配置哦! driver.execute_script(" var a = window.innerHeight; window.scrollBy(0,a*0.5); ") # 滚动一次,页面内容会更新一部分。在滚动之后,查找当前页面是否包含了它。 # 如果没有,继续滚动。如果有,退出。 try: WebDriverWait(driver, 10).until(EC.visibility_of_element_located(lo)) except: pass else: print("找到啦!!!") driver.find_element(*lo).click() break_flag = True # 终止for循环 break if break_flag is True: # 终止While循环 break # time.sleep(3) # 更新滚动 old_body_height = new_body_height scrolled_height = new_body_height new_body_height = driver.execute_script(" var a = document.body.scrollHeight; return a; ") print("老-当前整个html页面的body-高度:", old_body_height) print("新-当前整个html页面的body-高度:", new_body_height)
原文:https://www.cnblogs.com/ajiji/p/12057463.html