• python Web自动化之Selenium的基本使用


    1.selenium介绍

    • 概述
      Selenium是一个用于Web应用程序测试的工具。Selenium测试直接运行在浏览器中,就像真正的用户在操作一样。

    • 优势

      • 开源软件:源代码开放,可根据需要来增加工具的某些功能;
      • 跨平台:linux、windows、mac;
      • 多语言:支持Java、Python、C#、JavaScript、Ruby等。
    • WebDriver API支持的开发语言

      • Java
      • Python
      • PHP
      • JavaScript
      • Perl
      • Ruby
      • C#
    • Selenium WebDriver原理

    Request
    Response
    脚本
    Browser Drivers
    Browsers
    • Selenium Client Library
      • Selenium自动化测试人员可以使用Java、Ruby、Python、C#等语言,利用它们提供的库来编写脚本。
    • JSON Wire Protocol Over HTTP Client
      • JSON Wire Protocol是在HTTP服务器之间传输信息的REST风格的API。每个浏览器驱动程序(如FirefoxDriver、ChromeDriver等)都有它们各自的HTTP服务器。
    • Browser Drivers
      • 不同的浏览器都包含一个单独的浏览器驱动程序。浏览器驱动程序与相应的浏览器通信。当浏览器驱动程序接收到指令后,将在相应的浏览器中执行,相应信息以HTTP的形式返回。
    • Browsers
      • Selenium支持多种浏览器,如Firefox、Chrome、IE、Safari、Opera、Edge等。

    2.环境搭建–Selenium及相关软件安装配置

    3.selenium的基本使用

    3.1 入门案例

    from selenium import webdriver
    from time import sleep
    
    # 1.创建WebDriver对象
    # 如果将驱动添加到了系统环境变量目录中,可不带参数
    # driver = webdriver.Chrome()
    # 如果没有添加到系统环境变量目录中,需要通过参数指定
    from selenium.webdriver.chrome.service import Service
    
    # DeprecationWarning: executable_path has been deprecated, please pass in a Service object
    # https://www.likecs.com/ask-1641032.html
    service = Service(r"D:\software\chromedriver.exe")
    driver = webdriver.Chrome(service=service)
    # 2.url请求地址
    url = 'https://www.baidu.com'
    # 使用浏览器打开指定页面
    # 3.发送请求
    driver.get(url)
    # 4.睡眠3秒
    sleep(3)
    # 5.关闭驱动对象
    driver.close()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22

    在这里插入图片描述

    3.2 元素查找

    可通过webDriver的By方法获取元素。

    from selenium.webdriver.common.by import By
    
    # def find_element(self, by=By.ID, value=None)
    # def find_elements(self, by=By.ID, value=None)
    
    • 1
    • 2
    • 3
    • 4

    支持参数包含:

    • ID
    • CLASS_NAME
    • NAME
    • TAG_NAME
    • CSS_SELECTOR
    • XPATH
    • LINK_TEXT
    • PARTIAL_LINK_TEXT
      在这里插入图片描述

    对于一段html

      <input type="text" class="s_ipt" name="wd" id="kw" maxlength="100" autocomplete="off">
    
    • 1

    如下代码可以获取到这个标签:

      # 通过id定位元素
      driver.find_element(by=By.ID, value='kw')
      # 通过name定位元素
      driver.find_element(by=By.NAME, value='wd')
      # 通过class_name定位元素
      driver.find_element(by=By.CLASS_NAME, value='s_ipt')
      # 通过tag_name标签名定位元素
      driver.find_element(by=By.TAG_NAME, value='input')
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 示例
      from selenium import webdriver
      from time import sleep
      from selenium.webdriver.chrome.service import Service
      from selenium.webdriver.common.by import By
      
      # 1.创建WebDriver对象
      service = Service(r"D:\software\chromedriver.exe")
      driver = webdriver.Chrome(service=service)
      # 2.url请求地址
      url = 'https://www.baidu.com'
      
      # 3.发送请求
      driver.get(url)
      # 
      # 通过id定位元素,send_keys()在输入框中输入内容
      driver.find_element(by=By.ID, value='kw').send_keys('python')
      # 通过name定位元素
      # driver.find_element(by=By.NAME, value='wd')
      # 通过class_name定位元素
      # driver.find_element(by=By.CLASS_NAME, value='s_ipt')
      # 通过tag_name标签名定位元素
      # driver.find_element(by=By.TAG_NAME, value='input')
      
      # 
      # 通过id定位元素,click方法进行点击操作
      driver.find_element(by=By.ID, value='su').click()
      
      
      # 4.睡眠3秒
      sleep(3)
      # 5.关闭驱动对象
      driver.close()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 超链接(a标签)

      • link_text
      • partial_link_text
      • 如果使用相同的规则匹配到多个标签,这些方法只返回第一个匹配到的标签

    对于一段html

      <a href="http://news.baidu.com" target="_blank" class="mnav c-font-normal c-color-t">新闻a>
    
    • 1

    如下代码都可以访问到这个标签

      # 精确查找-->完整关键字查找-->通过link_text定位元素
      driver.find_element(by=By.LINK_TEXT, value='新闻').click()
      
      # 模糊查找-->部分关键字查找-->通过partial_link_text定位元素
      driver.find_element(by=By.PARTIAL_LINK_TEXT, value='新').click()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 示例
      from selenium import webdriver
      from time import sleep
      from selenium.webdriver.chrome.service import Service
      from selenium.webdriver.common.by import By
      
      # 1.创建WebDriver对象
      service = Service(r"D:\software\chromedriver.exe")
      driver = webdriver.Chrome(service=service)
      # 2.url请求地址
      url = 'https://www.baidu.com'
      # 使用浏览器打开指定页面
      # 3.发送请求
      driver.get(url)
      
      # 新闻
      # 精确查找-->完整关键字查找-->通过link_text定位元素,click方法进行点击操作
      driver.find_element(by=By.LINK_TEXT, value='新闻').click()
      
      # 模糊查找-->部分关键字查找-->通过partial_link_text定位元素
      driver.find_element(by=By.PARTIAL_LINK_TEXT, value='新').click()
      
      # 4.睡眠3秒
      sleep(3)
      # 5.关闭驱动对象
      driver.close()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • css选择器语法
    选择器示例描述
    class.intro选择class=“intro”的所有元素
    #id#firstname选择id=“firstname”的所有元素
    **选择所有元素
    elementp选择所有

    元素

    element,elementdiv,p选择所有
    元素和

    元素

    element elementdiv p选择所有
    元素内部的全部

    元素

    element>elementdiv>p选择父元素为
    元素的所有

    元素

    element+elementdiv+p选择紧接在
    元素之后的所有

    元素

    [attribute][target]选择带有target属性的所有元素
    [attribute=value][target=_blank]选择target=“_blank”的所有元素

    css选择器参考手册:https://www.w3school.com.cn/cssref/css_selectors.asp

    对于一段html

      <input id="username_id" type="text" name="username" class="red">
    
    • 1

    如下代码都可以获取到这个标签

      # id选择器
      driver.find_element(by=By.CSS_SELECTOR, value='#username_id')
      # 属性选择器
      driver.find_element(by=By.CSS_SELECTOR, value='[name=username]')
      # 类选择器
      driver.find_element(by=By.CSS_SELECTOR, value='.red')
      # 标签选择器
      driver.find_element(by=By.CSS_SELECTOR, value='input')
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 示例
      from selenium import webdriver
      from time import sleep
      from selenium.webdriver.chrome.service import Service
      from selenium.webdriver.common.by import By
      
      # 1.创建WebDriver对象
      service = Service(r"D:\software\chromedriver.exe")
      driver = webdriver.Chrome(service=service)
      
      # 2.url请求地址
      url = 'https://www.baidu.com'
      
      # 3.发送请求
      driver.get(url)
      # 
      
      # id选择器
      el1 = driver.find_element(by=By.CSS_SELECTOR, value='#kw')
      print(el1)
      # 属性选择器
      el2 = driver.find_element(by=By.CSS_SELECTOR, value='[name=wd]')
      print(el2)
      # 类选择器
      el3 = driver.find_element(by=By.CSS_SELECTOR, value='.s_ipt')
      print(el3)
      # 标签选择器
      el4 = driver.find_element(by=By.CSS_SELECTOR, value='input')
      print(el4)
      
      # 4.睡眠3秒
      sleep(3)
      # 5.关闭驱动对象
      driver.close()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • xpath概念
      xpath(XML Path Language),即XML路径语言,可用来在XML文档中对元素和属性进行遍历。XML和HTML一样,是标记语言,通过标签的嵌套来表达信息。多重嵌套,形成了父节点、子节点等关系,xpath就是用来在这些节点中找到需要的数据。通过Chrome的调试工具(F12打开),可获得特定的xpath(Elements–>选中元素–>右键–>Copy–>Copy XPath)。

    • xpath表达式

      • 选取节点

        表达式描述
        nodename选取此节点的所有子节点。
        /从根节点选取。
        //从匹配选择的当前节点选择文档中的节点,而不考虑它们的位置。
        .选取当前节点。
        选取当前节点的父节点。
        @选取属性。
        • 示例

          路径表达式结果
          bookstore选取 bookstore 元素的所有子节点。
          /bookstore选取根元素 bookstore。注释:假如路径起始于正斜杠( / ),则此路径始终代表到某元素的绝对路径!
          bookstore/book选取属于 bookstore 的子元素的所有 book 元素。
          //book选取所有 book 子元素,而不管它们在文档中的位置。
          bookstore//book选择属于 bookstore 元素的后代的所有 book 元素,而不管它们位于 bookstore 之下的什么位置。
          //@lang选取名为 lang 的所有属性。
      • 获取内容

        表达式描述
        @选取属性
        text()获取文本内容

      参考:https://www.w3school.com.cn/xpath/xpath_syntax.asp

      from selenium import webdriver
      from time import sleep
      from selenium.webdriver.chrome.service import Service
      from selenium.webdriver.common.by import By
      
      # 1.创建WebDriver对象
      # 如果将驱动添加到了系统环境变量目录中,可不带参数
      # driver = webdriver.Chrome()
      # 如果没有添加到系统环境变量目录中,需要通过参数指定
      
      service = Service(r"D:\software\chromedriver.exe")
      driver = webdriver.Chrome(service=service)
      # 2.url请求地址
      url = 'https://www.baidu.com'
      
      # 3.发送请求
      driver.get(url)
      driver.find_element(by=By.XPATH, value='//*[@id="kw"]').send_keys('李白')
      driver.find_element(by=By.XPATH, value='//*[@id="su"]').click()
      
      # 4.睡眠
      sleep(5)
      # 5.关闭驱动对象
      driver.close()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24

    3.3 元素的其他操作

    • 元素操作
      • clear():清除文本
      • send_keys():模拟输入
      • click():单击元素
    • 获取属性元素
      • size:返回元素大小
      • text:获取元素文本内容
      • get_attribute():获取属性值
      • is_display():判断元素是否可见
      • is_enabled():判断元素是否可用
    from selenium import webdriver
    from time import sleep
    from selenium.webdriver.chrome.service import Service
    from selenium.webdriver.common.by import By
    
    # 1.创建WebDriver对象
    service = Service(r"D:\software\chromedriver.exe")
    driver = webdriver.Chrome(service=service)
    # 2.url请求地址
    url = 'https://www.baidu.com'
    
    # 3.发送请求
    driver.get(url)
    el1 = driver.find_element(by=By.XPATH, value='//*[@id="kw"]')
    el1.send_keys('疾风剑豪')
    sleep(2)
    # 清除文本
    el1.clear()
    # driver.find_element(by=By.XPATH, value='//*[@id="su"]').click()
    # 获取元素尺寸大小
    print(el1.size)
    # 获取文本内容
    print(el1.text)
    # 获取属性值
    print(el1.get_attribute('class'))
    # 查看是否可用(是否可点击)
    print(el1.is_enabled())
    # 查看元素是否显示
    print(el1.is_displayed())
    # 查看元素是否选中
    print(el1.is_selected())
    
    # 4.睡眠
    sleep(5)
    # 5.关闭驱动对象
    driver.close()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36

    3.4 浏览器的基本操作

    • 浏览器操作方法
      • maximize_window():窗口最大化
      • set_window_size(width, height):设置窗口宽高(单位为像素)
      • set_window_position(x,y):设置窗口位置,浏览器窗口左上角相对于屏幕左上角的位置
      • back():后退
      • forward():前进
      • refresh():刷新页面
      • close():关闭当前页面
      • quit():关闭浏览器
    • 浏览器信息(属性)
      • title:获取页面标题
      • current_url:获取当前页面的url地址

    3.5 页面等待

    3.5.1 显式等待
    • 操作步骤
      • 1.使用WebDriverWait包装webDriver对象
      • 2.使用webDriverWait的util方法,传入可调用对象(一般是presence_of_element_locate函数的返回值)
      • 每隔一段时间不断尝试查找元素,找到了就返回。如果超过指定时间还没找到就报错。
    • 示例:
    import time
    from selenium import webdriver
    from selenium.webdriver.chrome.service import Service
    from selenium.webdriver.common.by import By
    from selenium.webdriver.support import expected_conditions as EC
    from selenium.webdriver.support.wait import WebDriverWait
    
    # 1.创建WebDriver对象
    service = Service(r"D:\software\chromedriver.exe")
    driver = webdriver.Chrome(service=service)
    
    # 2.url请求地址
    url = 'https://hanyu.baidu.com/shici/detail?pid=3bae8ab343d84e359bea52e48db609d2&from=kg0'
    
    # 3.发送请求
    driver.get(url)
    
    # 显式等待
    el1 = WebDriverWait(driver, 3).until(EC.presence_of_element_located((By.ID, 'poem-detail-header')))
    print(el1)
    
    # 4.睡眠
    time.sleep(5)
    
    # 5.关闭驱动对象
    driver.close()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    3.5.2 隐式等待
    • 操作步骤
      在创建好webDriver对象之后,调用implicitly_wait()方法传入超时时间即可
    • 原理
      • 元素在第一次就定位到则不会触发隐式等待时长。
      • 如果定位某一元素失败,就会触发隐式等待有效时长。
      • 如果在指定时间内加载完毕,则继续执行。否则,抛出NoSuchElementException异常。
    • 示例
    import time
    from selenium import webdriver
    from selenium.webdriver.chrome.service import Service
    from selenium.webdriver.common.by import By
    
    # 1.创建WebDriver对象
    service = Service(r"D:\software\chromedriver.exe")
    driver = webdriver.Chrome(service=service)
    # 隐式等待
    driver.implicitly_wait(5)
    
    # 2.url请求地址
    url = 'https://hanyu.baidu.com/shici/detail?pid=3bae8ab343d84e359bea52e48db609d2&from=kg0'
    
    # 3.发送请求
    driver.get(url)
    el1 = driver.find_element(By.ID, 'poem-detail-header')
    print(el1)
    
    # 4.睡眠
    time.sleep(5)
    
    # 5.关闭驱动对象
    driver.close()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24

    3.6 鼠标操作

    selenium可以模拟鼠标操作

    • 操作步骤

      • 创建ActionChains对象
      • 使用ActionChains对象的方法,进行操作
        • context_click():右击,模拟鼠标右击效果
        • double_click():双击,模拟鼠标双击
        • drag_and_drop():拖动,模拟鼠标拖动
        • move_to_element():悬停,模拟鼠标悬停效果
        • 其他:参考ActionChains源码
      • 通过ActionChains提交这些操作:perform()执行
    • 示例

      • 拖动
      from selenium import webdriver
      from time import sleep
      from selenium.webdriver import ActionChains
      from selenium.webdriver.chrome.service import Service
      from selenium.webdriver.common.by import By
      
      # 1.创建WebDriver对象
      
      service = Service(r"D:\software\chromedriver.exe")
      driver = webdriver.Chrome(service=service)
      # 2.url请求地址
      url = 'https://www.baidu.com'
      
      # 3.发送请求
      driver.get(url)
      driver.maximize_window()
      sleep(1)
      el1 = driver.find_element(by=By.XPATH, value='//*[@id="kw"]')
      # 创建一个事件链对象
      chains = ActionChains(driver)
      
      el2 = driver.find_element(by=By.XPATH, value='//*[@id="form"]/span[1]')
      
      chains.drag_and_drop(el2, el1)
      
      # 事件提交
      chains.perform()
      
      # 4.睡眠3秒
      sleep(3)
      # 5.关闭驱动对象
      driver.close()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 移动鼠标
      import time
      from selenium import webdriver
      from selenium.webdriver import ActionChains
      from selenium.webdriver.chrome.service import Service
      from selenium.webdriver.common.by import By
      
      # 1.创建WebDriver对象
      
      service = Service(r"D:\software\chromedriver.exe")
      driver = webdriver.Chrome(service=service)
      # 2.url请求地址
      url = 'https://www.baidu.com'
      
      # 3.发送请求
      driver.get(url)
      driver.maximize_window()
      time.sleep(1)
      # 创建一个事件链对象
      chains = ActionChains(driver)
      
      el1 = driver.find_element(by=By.XPATH, value='//*[@id="s-top-left"]/div/a')
      
      chains.move_to_element(el1)
      
      # 事件提交
      chains.perform()
      
      # 4.睡眠3秒
      time.sleep(3)
      # 5.关闭驱动对象
      driver.close()
      driver.quit()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32

    3.7 键盘操作

    • 方法
      element_send_keys()
    • 参数
      • 普通字符串
      • 键盘按键
    • 示例
    """
    要求
        1.输入文本:将进酒李白,暂停3秒,删除“李白”
        2.全选文本:将进酒
        3.剪切:将进酒,暂停3秒
        4.粘贴到输入框,点击搜索
    """
    
    import time
    
    from selenium import webdriver
    from selenium.webdriver import Keys
    from selenium.webdriver.chrome.service import Service
    from selenium.webdriver.common.by import By
    
    # 1.创建WebDriver对象
    service = Service(r"D:\software\chromedriver.exe")
    driver = webdriver.Chrome(service=service)
    # 2.url请求地址
    url = 'https://www.baidu.com'
    
    # 3.发送请求
    driver.get(url)
    
    # 定位输入框
    el1 = driver.find_element(by=By.XPATH, value='//*[@id="kw"]')
    # 输入文本
    el1.send_keys('将进酒李白')
    time.sleep(3)
    # 删除“李白”
    el1.send_keys(Keys.BACK_SPACE*2)
    # 全选
    el1.send_keys(Keys.CONTROL, 'a')
    # 剪切
    el1.send_keys(Keys.CONTROL, 'x')
    time.sleep(3)
    # 复制
    # el1.send_keys(Keys.CONTROL, 'c')
    # 粘贴
    el1.send_keys(Keys.CONTROL, 'v')
    # 点击搜索
    driver.find_element(by=By.XPATH, value='//*[@id="su"]').click()
    
    # 4.睡眠
    time.sleep(5)
    # 5.关闭驱动对象
    driver.close()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47

    3.8 页面滚动

    WebDriver类库中提供了可调用JavaScript脚本的方法,可以通过JavaScript脚本来达到操作滚动条的目的。

    • 方法
      • 让浏览器执行js代码:driver.execute_script(js代码字符串)
      • 滚动的js代码
        • 绝对滚动:window.scrollTo(x,y)
        • 相对滚动:window.scrollBy(x,y)
    import time
    from selenium import webdriver
    from selenium.webdriver.chrome.service import Service
    
    # 1.创建WebDriver对象
    service = Service(r"D:\software\chromedriver.exe")
    driver = webdriver.Chrome(service=service)
    # 2.url请求地址
    url = 'https://www.baidu.com'
    
    # 3.发送请求
    driver.get(url)
    driver.maximize_window()
    time.sleep(2)
    
    # 绝对滚动
    js_str = "window.scrollTo(1920,1080)"
    driver.execute_script(js_str)
    
    # 4.睡眠
    time.sleep(5)
    
    # 5.关闭驱动对象
    driver.close()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24

    参考文章:

  • 相关阅读:
    bp神经网络对数据的要求,bp神经网络参数有哪些
    【springboot】20、Spring Boot 整合 MyBatis
    linux 发行版中在容器内访问热插拔 U 盘的分区内容
    用于割草机器人,商用服务型机器人的陀螺仪
    杰理之、产线装配环节【篇】
    tiup cluster restart
    好用到爆的10款3DMAX插件,再也不用怕做不出高逼格的模型啦!
    童年经典,任天堂switch红白机游戏
    如何把图片分辨率调低?如何调整照片的分辨率?
    HTML常用特殊字符:
  • 原文地址:https://blog.csdn.net/username666/article/details/126236901