• selenium元素定位问题


    一、按钮点击

    具体网页信息如下:

    定位的时候driver.find_element(By.CLASS_NAME, 方法搞不定。

    定位方法: 

    方法一:通过文本定位

    1. driver.find_element(By.XPATH, "//*[text()='高分一号']").click()
    2. time.sleep(3)

    如果是部分文字

    1. #部分文字
    2. python:browser.find_element_by_xpath("//*[contains(text(),'一号')]").click()

    方法二:使用JS脚步,通过类名来定位

    因为一共有7个,写了个循环,

    1. for i in range(7):
    2. name='info-item cursor'
    3. js="document.getElementsByClassName('info-item cursor')[{}].click();".format(i)
    4. driver.execute_script(js);

    注意一些按钮点击后需要回到上一步再次点击。用相同的方法点击上一层按钮即可。

    二、图片定位并下载保存

     网页信息如下:

     

     定位方法:

            使用标签tag=img查找到元素,用requests库下载图片

            driver=get_url(url)就是对获取网页这一功能做一个封装,形成一个单独的函数方便使用。

    1. def get_url(url):
    2. chrome_options = Options().add_argument("start-maximized")
    3. service = Service(
    4. executable_path=r"C:\Users\***\PycharmProjects\chromedriver\chromedriver-win64\chromedriver.exe")#chromedriver.exe的位置
    5. driver = webdriver.Chrome(service=service, options=chrome_options)
    6. driver.get(url)
    7. return driver
    1. def img_extr1_ImageGP():#按标签tag来检索图片,并且保存
    2. url_str2 = 'https://www.bic.ac.cn/ImageGP/index.php/Home/Index/Lineplot.html'
    3. driver = get_url(url_str2)
    4. images = driver.find_elements(By.TAG_NAME, "img")#使用标签tag=img进行查找
    5. print(images)
    6. i=13
    7. for image in images:
    8. image_url = image.get_attribute("src")
    9. print(image_url)
    10. # 这里可以使用Python的requests库或其他下载工具来下载图片
    11. img_data = requests.get(image_url).content
    12. with open("./{}.jpg".format(i), 'wb') as fp:
    13. fp.write(img_data)
    14. i=i+1
    15. # 关闭浏览器
    16. driver.quit()

     

    三、网页截图,分别保存和拼接

    代码如下:

            def test_screen_shot1(driver,img_id):#拼接图片

            def test_screen_shot2(driver,image_id):#不拼接

            函数使用的参数分别为:

            driver=get_url(url)上方代码中有该函数。就是对获取网页这一功能做一个封装,形成一个单独的函数方便使用。

            img_id是图片编号的起始序号

    1. def test_screen_shot1(driver,img_id):#拼接图片
    2. width = driver.execute_script("return document.documentElement.scrollWidth")
    3. page_height = driver.execute_script("return document.documentElement.scrollHeight")
    4. window_height = driver.get_window_size()['height']
    5. # 获取页面宽度及其宽度
    6. print(width, page_height, window_height)
    7. i = img_id
    8. driver.save_screenshot('{}.png'.format(i))
    9. if page_height > window_height:
    10. n = page_height // window_height # 需要滚动的次数
    11. base_mat = np.atleast_2d(Image.open('{}.png'.format(i))) # 打开截图并转为二维矩阵
    12. i=i+1
    13. for j in range(n):
    14. driver.execute_script(f'document.documentElement.scrollTop={window_height * (j + 1)};')
    15. time.sleep(.5)
    16. driver.save_screenshot(f'{j+i}.png') # 保存截图
    17. mat = np.atleast_2d(Image.open(f'{j+i}.png')) # 打开截图并转为二维矩阵
    18. base_mat = np.append(base_mat, mat, axis=0) # 拼接图片的二维矩阵
    19. Image.fromarray(base_mat).save('{}.png'.format(n+img_id))
    20. # 截图并关掉浏览器
    21. # driver.get_screenshot_as_file('{}.png'.format(i))
    22. def test_screen_shot2(driver,image_id):#不拼接
    23. driver.implicitly_wait(10)
    24. driver.set_page_load_timeout(6)
    25. # 获取网页高度
    26. body_height = driver.execute_script('return document.body.scrollHeight;')
    27. window_height = driver.execute_script('return window.innerHeight;')
    28. js = "window.scroll(0,arguments[0]*arguments[1])"
    29. print(body_height,window_height)
    30. i = 0
    31. driver.get_screenshot_as_file(f"{i+image_id}.png")
    32. while i * window_height < body_height:
    33. driver.execute_script(js, window_height, i)
    34. time.sleep(5)
    35. driver.get_screenshot_as_file(f"{i+image_id}.png")
    36. i += 1

    附录(本博客使用的头文件):

    1. from selenium.webdriver.common.by import By
    2. from selenium.webdriver.chrome.service import Service
    3. from PIL import Image
    4. import numpy as np
    5. import time
    6. from selenium import webdriver
    7. from selenium.webdriver.chrome.options import Options
    8. import selenium.webdriver.support.ui as ui
    9. import requests

  • 相关阅读:
    【CSDN竞赛】第八期解题报告
    el-table父子展示不同内容;隐藏内层选择器;列添加不同颜色
    ICCV 2023 | SuS-X:仅靠类别名称微调CLIP模型,剑桥大学联合DeepMind出品
    分治&暴力求解最近点对问题 + 时间性能量化分析
    计算机毕业设计Java校园招聘系统设计(系统+源码+mysql数据库+lw文档)
    webrtc QOS笔记四 Nack机制浅析
    chatgpt赋能python:Python散点图的颜色设置
    GoLang:云原生时代致力于构建高性能服务器的后端语言
    微服务保护-初识Sentinel
    Python接口自动化测试post请求和get请求,获取请求返回值
  • 原文地址:https://blog.csdn.net/maryfei/article/details/136585874