0


【Python】从0开始写脚本、Selenium详细教程、附源码案例(保姆篇)

在这里插入图片描述

文章目录

更多相关内容可查看

准备工作

首先有python环境以及pycharm工具若需要下载:请参考【Python/PyCharm】卸载、安装、配置环境、及错误解决(保姆篇)

安装selenium

在pycharm终端运行如下命令,下图为安装成功

  1. pip installselenium==4.3.0
  2. pip list

在这里插入图片描述


配置浏览器驱动

下载浏览器驱动这里给出各浏览器(Chrome、Firefox、Edge等)的驱动下载地址,自行下载所需浏览器驱动

在这里插入图片描述

查看自己的浏览器版本,下载对应版本的驱动
在这里插入图片描述

我这里是126的Edge

在这里插入图片描述

将下载好的浏览器驱动放置在Python安装目录下(即Python环境变量配置目录)

在这里插入图片描述


脚本测试

这里是一个简单的脚本可以打开浏览器,三秒后关闭

  1. import time
  2. # 导入selenium包from selenium import webdriver
  3. # 打开Firefox浏览器
  4. browser = webdriver.Edge()# 停留三秒
  5. time.sleep(3)# 关闭浏览器
  6. browser.quit()

到这里就可以打开页面了,例如一些自动抢票、自动帮你打开页面、或者自动帮助你日常需要干的事情、后面都会给出案例


什么是Selenium?

附官方文档:https://www.selenium.dev/zh-cn/documentation/webdriver/getting_started/first_script/

  1. Selenium

是一个用于自动化浏览器操作的开源工具套件。它最初是为Web应用程序测试而创建的,但后来也被广泛用于网页数据抓取等任务。Selenium支持多种浏览器(如Chrome、Firefox、Safari等)和操作系统(Windows、Mac、Linux等),并提供了灵活的API来模拟用户在浏览器中的操作


Selenium功能示例(可直接拷贝执行)

编写一个简单的Python脚本来使用Selenium打开一个网页,并获取网页的标题

  1. from selenium import webdriver
  2. # 使用Chrome浏览器驱动程序
  3. driver = webdriver.Edge()# 打开网页
  4. driver.get("https://www.example.com")# 获取网页标题并输出print("Page title is:", driver.title)# 关闭浏览器
  5. driver.quit()

在这里插入图片描述

下面是一个示例,自动打开csdn并进行搜索

  1. import time
  2. from selenium import webdriver
  3. from selenium.webdriver.common.by import By
  4. from selenium.webdriver.support import expected_conditions as EC
  5. from selenium.webdriver.support.wait import WebDriverWait
  6. defopen_csdn():
  7. driver = webdriver.Edge()
  8. driver.get("https://blog.csdn.net/Aaaaaaatwl/article/details/140791747")
  9. input_text = WebDriverWait(driver,30).until(
  10. EC.element_to_be_clickable((By.ID,"search-blog-words")))
  11. input_text.send_keys("Python")
  12. password_login_tab = WebDriverWait(driver,30).until(
  13. EC.element_to_be_clickable((By.CLASS_NAME,"btn-search-blog")))
  14. password_login_tab.click()
  15. time.sleep(20)
  16. driver.quit()if __name__ =="__main__":
  17. open_csdn()

上述代码是监听了一个输入框跟一个按钮

在这里插入图片描述

成功示例

在这里插入图片描述


Selenium使用

Selenium元素定位

我个人觉得定位是基本,就是如何找到以上案例中的输入框,按钮,剩下的其他就是最基本的输入输出api了

  1. 当使用Selenium通过元素的ID来定位元素时,可以使用By.ID选择器。以下是一个简单的示例代码,演示了如何使用Selenium定位并操作一个具有特定ID的元素:
  1. from selenium import webdriver
  2. from selenium.webdriver.common.by import By
  3. from selenium.webdriver.support.ui import WebDriverWait
  4. from selenium.webdriver.support import expected_conditions as EC
  5. # 创建一个.Edge WebDriver实例
  6. driver = webdriver.Edge()try:# 打开网页
  7. driver.get("https://example.com")# 等待页面加载完毕
  8. WebDriverWait(driver,10).until(EC.title_contains("Example Domain"))# 通过ID定位元素,并操作该元素
  9. element = WebDriverWait(driver,10).until(
  10. EC.element_to_be_clickable((By.ID,"element-id")))# 在找到的元素上执行操作,例如点击
  11. element.click()finally:# 关闭浏览器
  12. driver.quit()
  1. 通过元素的名称(name属性)来定位元素时,可以使用By.NAME选择器。以下是一个示例代码
  1. from selenium import webdriver
  2. from selenium.webdriver.common.by import By
  3. from selenium.webdriver.support.ui import WebDriverWait
  4. from selenium.webdriver.support import expected_conditions as EC
  5. # 创建一个Edge WebDriver实例
  6. driver = webdriver.Edge(executable_path='/path/to/your/msedgedriver.exe')try:# 打开网页
  7. driver.get("https://example.com")# 等待页面加载完毕
  8. WebDriverWait(driver,10).until(EC.title_contains("Example Domain"))# 通过名称定位元素,并操作该元素
  9. element = WebDriverWait(driver,10).until(
  10. EC.element_to_be_clickable((By.NAME,"element-name")))# 在找到的元素上执行操作,例如点击
  11. element.click()finally:# 关闭浏览器
  12. driver.quit()

3.通过类名(class name)定位元素可以使用By.CLASS_NAME选择器。以下是一个示例代码

  1. from selenium import webdriver
  2. from selenium.webdriver.common.by import By
  3. from selenium.webdriver.support.ui import WebDriverWait
  4. from selenium.webdriver.support import expected_conditions as EC
  5. # 创建一个Edge WebDriver实例
  6. driver = webdriver.Edge(executable_path='/path/to/your/msedgedriver.exe')try:# 打开网页
  7. driver.get("https://example.com")# 等待页面加载完毕
  8. WebDriverWait(driver,10).until(EC.title_contains("Example Domain"))# 通过类名定位元素,并操作该元素
  9. element = WebDriverWait(driver,10).until(
  10. EC.element_to_be_clickable((By.CLASS_NAME,"element-class")))# 在找到的元素上执行操作,例如点击
  11. element.click()finally:# 关闭浏览器
  12. driver.quit()
  1. 通过标签名定位:如果你想定位页面上的第一个<a>标签,那么可以这样定位它:
  1. from selenium import webdriver
  2. from selenium.webdriver.common.by import By
  3. from selenium.webdriver.support.ui import WebDriverWait
  4. from selenium.webdriver.support import expected_conditions as EC
  5. # 创建一个Edge WebDriver实例
  6. driver = webdriver.Edge(executable_path='/path/to/your/msedgedriver.exe')try:# 打开网页
  7. driver.get("https://example.com")# 等待页面加载完毕
  8. WebDriverWait(driver,10).until(EC.title_contains("Example Domain"))# 通过标签名定位元素,并操作该元素
  9. elements = driver.find_elements(By.TAG_NAME,"a")# 输出所有链接的文本内容for element in elements:print(element.text)finally:# 关闭浏览器
  10. driver.quit()
  1. 通过链接文本定位:如果页面上有一个链接,其文本是"About Us",那么可以这样定位它:
  1. # 创建一个Edge WebDriver实例(省略前文相同部分)try:# 打开网页
  2. driver.get("https://example.com")# 等待页面加载完毕
  3. WebDriverWait(driver,10).until(EC.title_contains("Example Domain"))# 通过链接文本定位元素,并点击该链接
  4. element = WebDriverWait(driver,10).until(
  5. EC.element_to_be_clickable((By.LINK_TEXT,"About Us")))# 点击链接
  6. element.click()finally:# 关闭浏览器
  7. driver.quit()
  1. 通过部分链接文本定位:如果页面上有一个链接,其文本是"Welcome to our website",你可以使用部分文本来定位它:
  1. # 创建一个Edge WebDriver实例(省略前文相同部分)try:# 打开网页
  2. driver.get("https://example.com")# 等待页面加载完毕
  3. WebDriverWait(driver,10).until(EC.title_contains("Example Domain"))# 通过部分链接文本定位元素,并点击该链接
  4. element = WebDriverWait(driver,10).until(
  5. EC.element_to_be_clickable((By.PARTIAL_LINK_TEXT,"Welcome")))# 点击链接
  6. element.click()finally:# 关闭浏览器
  7. driver.quit()
  1. 通过CSS选择器定位
  1. # 创建一个Edge WebDriver实例(省略前文相同部分)try:# 打开网页
  2. driver.get("https://example.com")# 等待页面加载完毕
  3. WebDriverWait(driver,10).until(EC.title_contains("Example Domain"))# 通过CSS选择器定位元素,并操作该元素
  4. element = WebDriverWait(driver,10).until(
  5. EC.element_to_be_clickable((By.CSS_SELECTOR,"input#username")))# 在找到的输入框中输入文本
  6. element.send_keys("username123")finally:# 关闭浏览器
  7. driver.quit()
  1. 通过XPath定位-F12选中框右键即可复制XPath路径
  1. # 创建一个Edge WebDriver实例(省略前文相同部分)try:# 打开网页
  2. driver.get("https://example.com")# 等待页面加载完毕
  3. WebDriverWait(driver,10).until(EC.title_contains("Example Domain"))# 通过XPath定位元素,并操作该元素
  4. element = WebDriverWait(driver,10).until(
  5. EC.element_to_be_clickable((By.XPATH,"//input[@id='username']")))# 在找到的输入框中输入文本
  6. element.send_keys("username123")finally:# 关闭浏览器
  7. driver.quit()

By对象实例对象

  1. classBy:"""
  2. Set of supported locator strategies.
  3. """
  4. ID ="id"
  5. XPATH ="xpath"
  6. LINK_TEXT ="link text"
  7. PARTIAL_LINK_TEXT ="partial link text"
  8. NAME ="name"
  9. TAG_NAME ="tag name"
  10. CLASS_NAME ="class name"
  11. CSS_SELECTOR ="css selector"

文本输入、清除与提交

  • send_keys(‘XXX’)文本输入。
  • clear()文本清空。
  • submit()提交:submit()只能用于包含属性type='submit’的标签,并且嵌套在form表单中。
  1. import time
  2. # 导入selenium包from selenium import webdriver
  3. from selenium.webdriver.common.by import By
  4. # 启动并打开指定页面
  5. browser = webdriver.Firefox()
  6. browser.get("http://www.csdn.net")# 通过css选择器定位输入框
  7. input_text = browser.find_element(By.CSS_SELECTOR,'#toolbar-search-input')# 输入文本
  8. input_text.send_keys("selenium")# 停留2
  9. time.sleep(2)# 清空文本
  10. input_text.clear()# 通过xpath选择器定位输入框,并输入CSDN
  11. input_text = browser.find_element(By.XPATH,'//*[@id="sb_form_q"]').send_keys("CSDN")
  12. time.sleep(2)# 定位提交按钮后提交
  13. browser.find_element(By.XPATH,'//*[@id="sb_form_go"]').submit()# 停留三秒后关闭浏览器
  14. time.sleep(3)
  15. browser.quit()

获取页面内容

  1. import time
  2. # 导入selenium包from selenium import webdriver
  3. from selenium.webdriver.common.by import By
  4. # 启动并打开指定页面
  5. browser = webdriver.Firefox()
  6. browser.get("http://www.csdn.net")# 获取标题
  7. title = browser.title
  8. # 输出print(title)# 获取源代码
  9. source_code = browser.page_source
  10. #输出源代码print(source_code)# 获取页面链接
  11. url = browser.current_url
  12. #输出页面链接print(url)# 获取标签内文本
  13. text = browser.find_element(By.XPATH,'/html/body/div[1]/div/div/div/div[2]/div/div/button/span').text
  14. print(text)# 关闭页面
  15. time.sleep(3)
  16. browser.quit()

调整浏览器窗口尺寸

  1. import time
  2. # 导入selenium包from selenium import webdriver
  3. from selenium.webdriver.common.by import By
  4. # 启动并打开指定页面
  5. browser = webdriver.Firefox()
  6. browser.get("http://www.csdn.net")# 窗口最大化
  7. browser.maximize_window()#停留2
  8. time.sleep(2)#窗口最小化
  9. browser.minimize_window()# 指定窗口尺寸
  10. browser.set_window_size(300,500)# 关闭页面
  11. time.sleep(3)
  12. browser.quit()

前进一页后退一页

  1. import time
  2. # 导入selenium包from selenium import webdriver
  3. from selenium.webdriver.common.by import By
  4. # 启动并打开指定页面
  5. browser = webdriver.Firefox()
  6. browser.get("http://www.csdn.net")
  7. browser.find_element(By.LINK_TEXT,'Python').click()#停留2
  8. time.sleep(2)# 页面后退一页
  9. browser.back()# 停留2
  10. time.sleep(2)# 前进一页
  11. browser.forward()# 关闭页面
  12. time.sleep(3)
  13. browser.quit()

页面刷新

  1. import time
  2. # 导入selenium包from selenium import webdriver
  3. from selenium.webdriver.common.by import By
  4. # 启动并打开指定页面
  5. browser = webdriver.Firefox()
  6. browser.get("http://www.csdn.net")
  7. browser.find_element(By.LINK_TEXT,'Python').click()#停留2
  8. time.sleep(2)# 页面刷新
  9. browser.refresh()# 关闭页面
  10. time.sleep(3)
  11. browser.quit()

窗口切换

  1. from time import sleep
  2. # 导入selenium包from selenium import webdriver
  3. from selenium.webdriver.common.by import By
  4. # 启动并打开指定页面
  5. browser = webdriver.Firefox()
  6. browser.get("http://www.csdn.net")
  7. sleep(2)# 获取当前窗口句柄
  8. page_context = browser.current_window_handle
  9. # 打开其它页面
  10. browser.find_element(By.XPATH,'//*[@id="toolbar-search-input"]').send_keys('selenium')
  11. browser.find_element(By.XPATH,'/html/body/div[1]/div/div/div/div[2]/div/div/button/span').click()
  12. sleep(2)# 切换到刚开始打开页面
  13. browser.switch_to.window(page_context)# 获取当前打开所有页面的句柄
  14. pages_context = browser.window_handles
  15. # 输出当前打开页面个数print(len(pages_context))# 结果:2# 关闭
  16. sleep(3)
  17. browser.quit()

frame/iframe内元素操作

  1. <!DOCTYPEhtml><html><head><metacharset="utf-8"><metaname="viewport"content="width=device-width, initial-scale=1"><title>frame内敛框架页面</title></head><body>
  2. 这是框架frame外:<inputtype="text"><iframeid='frame'src="http://www.csdn.net"width=1000pxheight=500px></iframe></body></html>
  1. from time import sleep
  2. # 导入selenium包from selenium import webdriver
  3. from selenium.webdriver.common.by import By
  4. # 启动并打开指定页面
  5. browser = webdriver.Firefox()
  6. browser.get("file:///C:/Users/admin/Desktop/frame.html")
  7. sleep(2)# 定位到iframe标签
  8. tag_iframe = browser.find_element(By.TAG_NAME,'iframe')# 切换到iframe框架页面内
  9. browser.switch_to.frame(tag_iframe)# 定位到框架内搜索框并输入内容
  10. browser.find_element(By.LINK_TEXT,'Python').click()
  11. sleep(2)# 从内敛框架页面切出
  12. browser.switch_to.parent_frame()
  13. browser.find_element(By.XPATH,"//input").send_keys("这是框架外面!")# 关闭浏览器
  14. sleep(3)
  15. browser.quit()

获取标签元素的属性值(复选框)

  1. <!DOCTYPEhtml><html><head><metacharset="utf-8"><metaname="viewport"content="width=device-width, initial-scale=1"><title></title></head><body>
  2. 用户名:<inputtype="text"name="user_name">
  3. 密码:<inputtype="password"name="pwd"><inputtype="checkbox"name="Java">Java
  4. <inputtype="checkbox"name="Python">Python
  5. <inputtype="checkbox"name="C++">C++
  6. <inputtype="checkbox"name="JavaScript">JavaScript
  7. <inputtype="checkbox"name="HTML">HTML
  8. </body></html>
  1. import time
  2. # 导入selenium包from selenium import webdriver
  3. from selenium.webdriver.common.by import By
  4. # 启动并打开指定页面
  5. browser = webdriver.Firefox()
  6. browser.get("file:///C:/Users/admin/Desktop/checkbox.html")# 定位input标签
  7. tag_input = browser.find_elements(By.TAG_NAME,'input')# 通过type属性的值来定位元素,并进行选取for type_value in tag_input:# 输出input标签的name属性的值:print(type_value.get_attribute("name"))# 对复选框进行选取操作if type_value.get_attribute("type")=="checkbox":
  8. type_value.click()
  9. time.sleep(2)# 关闭浏览器
  10. time.sleep(3)
  11. browser.quit()

下拉列表操作

  1. <!DOCTYPEhtml><html><head><metacharset="utf-8"><metaname="viewport"content="width=device-width, initial-scale=1"><title></title></head><body>
  2. 编程语言:<select><option>Java</option><option>C++</option><optionvalue="Python">Python</option><option>HTML</option><option>JavaScript</option></select></body></html>
  1. from time import sleep
  2. # 导入selenium包from selenium import webdriver
  3. from selenium.webdriver.common.by import By
  4. # 导入Select类from selenium.webdriver.support.select import Select
  5. # 启动并打开指定页面
  6. browser = webdriver.Firefox()
  7. browser.get("file:///C:/Users/admin/Desktop/select.html")# 定位下拉列表标签,并创建下拉列表对象
  8. select = Select(browser.find_element(By.TAG_NAME,"select"))# 通过value属性选择选项
  9. select.select_by_value("Python")
  10. sleep(2)# 通过文本内容选择选项
  11. select.select_by_visible_text("C++")
  12. sleep(2)# 通过选项索引号选择选项
  13. select.select_by_index(0)# 等同于 select.options[0].click()
  14. sleep(2)# 通过options属性循环选取for i in select.options:
  15. i.click()
  16. sleep(2)# 关闭浏览器
  17. sleep(3)
  18. browser.quit()

弹窗操作

  1. <!DOCTYPEhtml><html><head><metacharset="utf-8"><metaname="viewport"content="width=device-width, initial-scale=1"><title></title></head><body><inputtype="button"id="alert"value="alert弹窗"onclick="alert('这是alert()弹窗!')"><inputtype="button"id="confirm"value="confirm弹窗"onclick="confirm('这是confirm()弹窗!')"><inputtype="button"id="prompt"value="prompt弹窗"onclick="prompt('这是prompt()弹窗!','这是prompt()弹窗的默认值!')"></body></html>
  1. from time import sleep
  2. # 导入selenium包from selenium import webdriver
  3. from selenium.webdriver.common.by import By
  4. # 启动并打开指定页面
  5. browser = webdriver.Firefox()
  6. browser.get("file:///C:/Users/admin/Desktop/alert.html")# alert()弹窗处理
  7. browser.find_element(By.ID,"alert").click()
  8. sleep(2)# 获取弹窗对象
  9. alert = browser.switch_to.alert
  10. # 输出弹窗内容print(alert.text)# 结果:这是alert()弹窗!# 确认弹窗
  11. alert.accept()
  12. sleep(2)# confirm()弹窗
  13. browser.find_element(By.ID,"confirm").click()
  14. sleep(2)# 获取弹窗对象
  15. confirm = browser.switch_to.alert
  16. # 输出弹窗内容print(confirm.text)# 这是confirm()弹窗!# 执行性弹窗的取消按钮
  17. confirm.dismiss()# confirm.accept() # 执行弹窗确认按钮
  18. sleep(2)# prompt()弹窗
  19. browser.find_element(By.ID,"prompt").click()
  20. sleep(2)# 获取弹窗对象
  21. prompt = browser.switch_to.alert
  22. # 输出弹窗内容print(prompt.text)# 这是prompt()弹窗!# 向弹窗的输入框内输入内容
  23. prompt.send_keys("这是弹窗prompt()")
  24. sleep(2)# 执行性弹窗的确认按钮
  25. prompt.accept()# 关闭浏览器
  26. sleep(3)
  27. browser.quit()

鼠标操作

  1. from time import sleep
  2. # 导入selenium包from selenium import webdriver
  3. from selenium.webdriver import ActionChains
  4. from selenium.webdriver.common.by import By
  5. # 启动并打开指定页面
  6. browser = webdriver.Firefox()
  7. browser.get("https://www.csdn.net")
  8. sleep(2)# 创建ActionChains对象
  9. action = ActionChains(browser)# 定位标签并将鼠标移入,并呈现移入结果
  10. tag = browser.find_element(By.XPATH,'//div/a[@class="btn-write-new"]')
  11. action.move_to_element(tag).perform()
  12. sleep(3)
  13. tag = browser.find_element(By.CSS_SELECTOR,'.blog-nav-box')
  14. action.move_to_element(tag).perform()
  15. sleep(2)
  16. browser.find_element(By.LINK_TEXT,"数学").click()# 关闭浏览器
  17. sleep(2)
  18. browser.quit()

键盘操作

  1. from time import sleep
  2. # 导入selenium包from selenium import webdriver
  3. from selenium.webdriver import ActionChains, Keys
  4. from selenium.webdriver.common.by import By
  5. # 启动并打开指定页面
  6. browser = webdriver.Firefox()
  7. browser.get("https://www.csdn.net")
  8. sleep(2)
  9. input_text = browser.find_element(By.XPATH,'//*[@id="toolbar-search-input"]')
  10. input_text.send_keys("selenium")
  11. sleep(2)
  12. input_text.send_keys(Keys.CONTROL,"a")# 全选
  13. sleep(2)
  14. input_text.send_keys(Keys.CONTROL,'x')# 剪切
  15. sleep(2)
  16. input_text.send_keys(Keys.CONTROL,'v')# 粘贴
  17. sleep(2)
  18. input_text.send_keys(Keys.BACK_SPACE)# 回退一格# 关闭浏览器
  19. sleep(2)
  20. browser.quit()

JS代码执行

  1. from time import sleep
  2. # 导入selenium包from selenium import webdriver
  3. # 启动并打开指定页面
  4. browser = webdriver.Firefox()
  5. browser.get("https://www.csdn.net")
  6. sleep(2)# 执行js弹窗代码
  7. browser.execute_script("alert('这是js弹窗代码')")
  8. sleep(2)
  9. browser.switch_to.alert.accept()
  10. sleep(2)# 执行js窗口滚动条代码
  11. browser.execute_script("window.scrollTo(20,1000)")
  12. sleep(2)# 打开多个窗口
  13. browser.execute_script("window.open('https://www.baidu.com')")
  14. browser.execute_script("window.open('https://www.bing.com')")
  15. sleep(2)
  16. browser.quit()

窗口截图

  1. from time import sleep
  2. # 导入selenium包from selenium import webdriver
  3. # 启动并打开指定页面
  4. browser = webdriver.Firefox()
  5. browser.get("https://www.csdn.net")
  6. sleep(2)# 浏览器窗口截屏
  7. browser.get_screenshot_as_file("csdn.png")
  8. sleep(2)
  9. browser.quit()

三种等待方法

  • sleep(n)强制等待,需要导入time包,n表示等待秒数;用于避免因元素未加载出来而定位失败的情况。
  • implicitly_wait(n)隐式等待,如果超过n秒,抛出找不到元素的异常;隐式等待只需要声明一次,一般在打开浏览器后进行声明。隐式等待存在的问题是程序会一直等待整个页面加载完成才会执行下一步,有时候想要定位的元素早就加载好了,但是由于别的页面元素没加载好,仍会等到整个页面加载完成才能执行下一步。
  • WebDriverWait(browser,n,h):显式等待,browser代表浏览器对象,n等待时长,h频率。相比于隐式等待,显式等待只针对指定的元素生效,不再是针对所有的页面元素。可以根据需要定位的元素来设置显式等待,无需等待页面完全加载,节省了大量因加载无关紧要的页面元素而浪费的时间。使用方法WebDriverWait(browser,5,0.5).until(expected_conditions.presence_of_element_located((By.ID,‘kw’)))
  1. from selenium import webdriver
  2. from time import sleep
  3. from selenium.webdriver.common.by import By
  4. from selenium.webdriver.support.wait import WebDriverWait
  5. from selenium.webdriver.support import expected_conditions as EC
  6. browser = webdriver.Firefox()
  7. sleep(2)# 打开csdn首页
  8. browser.get("https://www.csdn.net")
  9. tag = WebDriverWait(browser,5,0.5).until(EC.presence_of_element_located((By.XPATH,'//*[@id="toolbar-search-input"]')))
  10. tag.send_keys("selenium")#关闭
  11. sleep(2)
  12. browser.quit()

本文转载自: https://blog.csdn.net/Aaaaaaatwl/article/details/140791747
版权归原作者 来一杯龙舌兰 所有, 如有侵权,请联系我们删除。

“【Python】从0开始写脚本、Selenium详细教程、附源码案例(保姆篇)”的评论:

还没有评论