Selenium操作常见控件实战

1.鼠标操作

流程:

● 引入ActionChains包。

● 定位要操作的元素。

● 固定写法:ActionChains(driver).xxx(pars).perform()。

方法汇总:

 实例:

1.1.鼠标单击操作

from selenium import webdriver
from time import sleep

driver = webdriver.Chrome()
driver.get('https://www.baidu.com/')
ele = driver.find_element_by_link_text('新闻')
ele.click()  # 鼠标单击
sleep(2)
driver.quit()

1.2.内置鼠标操作包

from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains
from time import sleep

driver = webdriver.Chrome()
driver.get('https://www.baidu.com/')
ele = driver.find_element_by_link_text('新闻')
# ele.click()  # 鼠标单击
ActionChains(driver).click(ele).perform()
sleep(2)
driver.quit()

1.3.鼠标双击操作

from selenium import webdriver
from time import sleep
from selenium.webdriver.common.action_chains import ActionChains

driver = webdriver.Chrome()
driver.get("http://sahitest.com/demo/clicks.htm")
ele = driver.find_element_by_xpath('/html/body/form/input[2]')
sleep(2)
# 通过double_click方法来模拟鼠标双击的操作
ActionChains(driver).double_click(ele).perform()
sleep(3)
driver.quit()

1.4.鼠标右击操作

from selenium import webdriver
from time import sleep
from selenium.webdriver.common.action_chains import ActionChains

driver = webdriver.Chrome()
driver.get("http://sahitest.com/demo/clicks.htm")
ele = driver.find_element_by_xpath('/html/body/form/input[4]')
sleep(2)
# 通过context_click方法模拟鼠标右击的操作
ActionChains(driver).context_click(ele).perform()

sleep(3)
driver.quit()

1.5.鼠标指针悬浮操作

from selenium import webdriver
from time import sleep
from selenium.webdriver.common.action_chains import ActionChains

driver = webdriver.Chrome()
driver.get("http://sahitest.com/demo/mouseover.htm")
ele = driver.find_element_by_xpath('/html/body/form/input[1]')
sleep(2)
# 通过move_to_element方法模拟鼠标指针的悬浮操作
ActionChains(driver).move_to_element(ele).perform()

sleep(3)
driver.quit()

1.6.鼠标拖动操作

from selenium import webdriver
from time import sleep
from selenium.webdriver.common.action_chains import ActionChains
driver = webdriver.Chrome()
driver.get("http://sahitest.com/demo/dragDropMooTools.htm")
source = driver.find_element_by_xpath('//*[@id="dragger"]')
target = driver.find_element_by_xpath('/html/body/div[5]')

sleep(2)
# 通过drag_and_drop方法模拟鼠标拖动操作
ActionChains(driver).drag_and_drop(source, target).perform()

sleep(3)
driver.quit()

2.键盘操作

2.1.文字输入

from selenium import webdriver
from time import sleep

driver = webdriver.Chrome()
driver.get("http://www.baidu.com/")
driver.find_element_by_id('kw').send_keys('storm') # 输入文字
sleep(3)
driver.quit()

2.2.组合键

from selenium import webdriver
from time import sleep
from selenium.webdriver.common.keys import Keys

'''
打开百度首页,在搜索框中输入文字"storm"
通过组合键"Ctrl+A"全选
通过组合键"Ctrl+C"复制
通过clear方法清除搜索框中的内容
通过组合键"Ctrl+V"粘贴刚才复制的内容
'''
driver = webdriver.Chrome()
driver.get("http://www.baidu.com/")
# 通过send_keys方法模拟键盘输入文字
driver.find_element_by_id('kw').send_keys('storm')
sleep(3)
# 通过Keys.×××模拟功能按键的操作
driver.find_element_by_id('kw').send_keys(Keys.CONTROL, 'a')
driver.find_element_by_id('kw').send_keys(Keys.CONTROL, 'c')
# 通过clear方法清除搜索框中的内容
driver.find_element_by_id('kw').clear()
sleep(3)
driver.find_element_by_id('kw').send_keys(Keys.CONTROL, 'v')
sleep(3)
driver.quit()

3.搜索框

clear方法在处理有提示信息(placeholder这个属性)的搜索框的时候很有用,一般需要先使用clear,再使用send_keys

from selenium import webdriver
from time import sleep

'''
搜索框常见操作
'''
driver = webdriver.Chrome()
driver.get('https://www.baidu.com/')
#定位百度搜索框
ele = driver.find_element_by_id('kw')
ele.send_keys('storm') # 通过send_keys方法输入内容
sleep(2)
ele.clear() # 通过clear方法清除搜索框中的内容
sleep(2)
ele.send_keys('storm') # 通过send_keys方法再次输入内容
print(ele.get_property('value')) # 获取搜索框中的内容:get_property('value')
print(ele.get_attribute('name')) # 获取元素的属性:get_attribute()
print(ele.tag_name) # 获取元素的tag name:tag_name
sleep(3)
driver.quit()

4.按钮

常见按钮有3种类型:button按钮、submit按钮、radio按钮,类型不同,点击方式有差异

button的点击,用click方法,button按钮不支持submit方法

from time import sleep

driver = webdriver.Chrome()
driver.get("http://sahitest.com/demo/clicks.htm")
driver.find_element_by_xpath("/html/body/form/input[3]").click()
sleep(2)
text = driver.find_element_by_name("t2").get_attribute('value')
if text == '[CLICK]':
      print('pass')
driver.quit()

submit可用submit方法

from time import sleep

driver = webdriver.Chrome()
driver.get('https://www.baidu.com/')
driver.find_element_by_id('kw').send_keys('storm')
driver.find_element_by_id('su').submit() # 对于submit按钮,可以使用submit方法
sleep(2)
driver.quit()

radio,判断是否选中:is_selected方法

from selenium import webdriver
from time import sleep

driver = webdriver.Chrome()
driver.get("http://sahitest.com/demo/clicks.htm")

ele = driver.find_element_by_xpath('/html/body/form/input[7]')
ele.click()
sleep(2)
if ele.is_selected():
      print('pass')
sleep(3)
driver.quit()

5.复选框

模拟单击选中复选框:ele.click()

模拟按空格键选中复选框:ele.send_keys(Keys.SPACE)

from selenium import webdriver
from time import sleep
from selenium.webdriver.common.keys import Keys

driver = webdriver.Chrome()
driver.get("http://sahitest.com/demo/clicks.htm")
ele = driver.find_element_by_xpath('/html/body/ul//input')
ele.click()
sleep(2)
if ele.is_selected():
      print('pass')
sleep(2)
ele.send_keys(Keys.SPACE)  #自己可以手动实践一下,按空格键可以选中或取消选中复选框
sleep(2)
driver.quit()

6.链接

获取链接文字:ele.text

单击链接:ele.click()

from selenium import webdriver
from time import sleep

driver = webdriver.Chrome()
driver.get('https://www.baidu.com/')
ele = driver.find_element_by_link_text('新闻')
print(ele.text)
ele.click()
sleep(2)
driver.quit()

7.select下拉列表

# 导入Select包,二选一:

from selenium.webdriver.support.ui import Select 

from selenium.webdriver.support.select import Select

#实例化Select:
Select(driver.find_element_by_id('s1Id'))

7.1.选择下拉选项

select类提供了3种选择某一选项的方法:

  • 通过index选择下拉选项——select_by_index(index);
  • 通过value值选择下拉选项——select_by_value(value);
  • 通过可见text选择下拉选项——select_by_visible_text(text)。
from selenium import webdriver
from selenium.webdriver.support.ui import Select
from time import sleep
import os

driver = webdriver.Chrome()
# driver = webdriver.Firefox()
html_file = 'File:///' + os.getcwd() + os.sep + 'myhtml6_2.html'
driver.get(html_file)
s1 = Select(driver.find_element_by_id('s1Id'))  # 实例化Select
sleep(2)
s1.select_by_index(1)  # 通过index选择第二个选项:o1
sleep(2)
s1.select_by_value("o2")  # 通过value值选择value="o2"的选项
sleep(2)
s1.select_by_visible_text("o3")  # 通过可见text选择text="o3"的值,即在打开下拉列表时我们可以看到的文本
sleep(2)
driver.quit()

7.2.取消下拉选项

select类提供了4种方法取消原来的选择:

通过index取消下拉选项——deselect_by_index(index);

通过value值取消下拉选项——deselect_by_value(value);

通过可见text取消下拉选项——deselect_by_visible_text(text);

全部取消选择——deselect_all()。

from selenium import webdriver
from selenium.webdriver.support.ui import Select
from time import sleep
import os

driver = webdriver.Chrome()
# driver = webdriver.Firefox()
html_file = 'File:///' + os.getcwd() + os.sep + 'myhtml6_3.html'
driver.get(html_file)
s1 = Select(driver.find_element_by_id('s1Id'))  # 实例化Select
sleep(2)
s1.select_by_index(1)  
sleep(2)
s1.deselect_by_index(1)# 通过index取消选择第二个选项:o1
sleep(2)
s1.select_by_value("o2")  
sleep(2)
s1.deselect_by_value("o2") # 通过value值取消选择value="o2"的选项
sleep(2)
s1.select_by_visible_text("o3")  
sleep(2)
s1.deselect_by_visible_text("o3") # 通过可见text取消选择text="o3"的选项
sleep(2)
s1.select_by_index(1)
s1.select_by_index(2)
s1.select_by_index(3)
sleep(2)
s1.deselect_all() # 取消选择上面选中的3个选项
sleep(2)
driver.quit()

7.3.返回选项

返回所有选项——options;

from selenium import webdriver
from selenium.webdriver.support.ui import Select
from time import sleep
import os

driver = webdriver.Chrome()
# driver = webdriver.Firefox()
html_file = 'File:///' + os.getcwd() + os.sep + 'myhtml6_3.html'
driver.get(html_file)
s1 = Select(driver.find_element_by_id('s1Id'))  # 实例化Select
sleep(2)
all_options = s1.options # 返回的是一个列表,列表中包括所有选项的元素
print("options的返回值类型:{}".format(type(all_options)))
mylist = [] # 定义一个空列表
for i in all_options:
    mylist.append(i.text)  # 将选项的文字存储到mylist这个列表
print('这个下拉列表的选项包括:{}'.format(mylist))

driver.quit()

返回第一个选中项——first_selected_option;

from selenium import webdriver
from selenium.webdriver.support.ui import Select
from time import sleep
import os

driver = webdriver.Chrome()
# driver = webdriver.Firefox()
html_file = 'File:///' + os.getcwd() + os.sep + 'myhtml6_3.html'
driver.get(html_file)
s1 = Select(driver.find_element_by_id('s1Id'))  # 实例化Select
sleep(2)
s1.select_by_index(1)
s1.select_by_index(2)
s1.select_by_index(3)
first = s1.first_selected_option.text
print('第一个被选中的选项文字是:{}'.format(first))
sleep(2)
driver.quit()

返回所有选中项——all_selected_options。

from selenium import webdriver
from selenium.webdriver.support.ui import Select
from time import sleep
import os

driver = webdriver.Chrome()
# driver = webdriver.Firefox()
html_file = 'File:///' + os.getcwd() + os.sep + 'myhtml6_3.html'
driver.get(html_file)
s1 = Select(driver.find_element_by_id('s1Id'))  # 实例化Select
sleep(2)
s1.select_by_index(1)
s1.select_by_index(2)
mylist = []
all = s1.all_selected_options
for i in all:
      mylist.append(i.text)
print('所有被选中的选项文字是:{}'.format(mylist))
sleep(2)
driver.quit()

7.4.判断select选项是否可多选

is_multiple,返回一个布尔值。

from selenium import webdriver
from selenium.webdriver.support.ui import Select
from time import sleep
import os

driver = webdriver.Chrome()
# driver = webdriver.Firefox()
html_file = 'File:///' + os.getcwd() + os.sep + 'myhtml6_3.html'
driver.get(html_file)
s1 = Select(driver.find_element_by_id('s1Id'))  # 实例化Select
res = s1.is_multiple # 返回True或False
print("该下拉列表中的选项是否可多选:{}".format(res))
sleep(2)
driver.quit()

8.input下拉列表

from selenium import webdriver
from time import sleep
import os
from selenium.webdriver.common.action_chains import ActionChains
from selenium.webdriver.common.keys import Keys

'''
以下代码使用Firefox操作成功,使用Chrome操作失败;
Firefox打开本地文件需要加"File:///"
'''
# driver = webdriver.Chrome()
driver = webdriver.Firefox()
html_file = 'File:///' + os.getcwd() + os.sep + 'myhtml6_5.html'
driver.get(html_file)
driver.find_element_by_id('select').send_keys('b')
sleep(3)
driver.find_element_by_id('select').send_keys(Keys.ARROW_DOWN)
sleep(3)
driver.find_element_by_id('select').send_keys(Keys.ENTER)

sleep(5)
driver.quit()

9.表格

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>学习操作表格-1</title>
</head>
<body>
<table border="1">
<tr>
<td>0-0</td>
<td>0-1</td>
<td id="CellWithId">Cell with id</td>
<td>0-3</td>
</tr>
<tr>
<td>1-0</td>
<td>1-1</td>
<td>1-2</td>
<td>1-3</td>
</tr>
<tr>
<td>2-0</td>
<td>2-1</td>
<td>2-2</td>
<td>2-3</td>
</tr>
</table>
<br>
</body>
</html>

9.1.获取某个单元格中的值

from selenium import webdriver
from time import sleep
import os

driver = webdriver.Chrome()
html_file = 'File:///' + os.getcwd() + os.sep + 'myhtml6_6.html'
driver.get(html_file)
text1 = driver.find_element_by_id('CellWithId').text  # 该单元格有id
print(text1)
driver.quit()

9.2.输出表格中所有单元格的值

from selenium import webdriver
from time import sleep
import os

driver = webdriver.Chrome()
html_file = 'File:///' + os.getcwd() + os.sep + 'myhtml6_6.html'
driver.get(html_file)
table = driver.find_element_by_xpath('/html/body/table[1]')
rows = table.find_elements_by_tag_name('tr')
cols = rows[0].find_elements_by_tag_name('td')
for i in range(len(rows)):
      for j in range(len(cols)):
            cell = rows[i].find_elements_by_tag_name('td')[j]
            print(cell.text)

driver.quit()

9.3.表格中嵌套一些子元素

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>表格示例-2</title>
</head>
<body>
<table id="t5">
<tbody>
<tr>
<td id="cell1">
<select id="s1">
<option value="0">ram</option>
<option value="1">sah</option>
</select>
</td>
<td id="cell2">ram</td>
</tr>
</tbody>
</table>
</body>
</html>
from selenium import webdriver
from selenium.webdriver.support.ui import Select
from time import sleep
import os

driver = webdriver.Chrome()
html_file = 'File:///' + os.getcwd() + os.sep + 'myhtml6_7.html'
driver.get(html_file)
s1 = Select(driver.find_element_by_id('s1'))
sleep(2)
s1.select_by_index(1)
sleep(2)
driver.quit()

10.框架

框架集(frameset)、框架(frame)、内联框架(iframe)

●frame是把网页分成包含多个页面的页面。它要有一个框架集页面frameset。

●iframe是一个浮动的框架,就是在页面中再加上一个页面。

●frame用来把页面横着或竖着切开,iframe用来在页面中插入一个矩形的小窗口。

●frame一般用来设置页面布局,将整个页面分成规则的几块,每一块里面包含一个新页面;iframe用来在页面的任何地方插入一个新的页面。

●frame用来控制页面格式,例如在一本电子书中,左边是章节目录,右边是正文,正文很长,看的时候要拖动,但又不想目录也被拖动得看不到了,这时可以将页面用frame分成规则的两页,一左一右。

●iframe则更灵活,不要求将整个页面划分,你可以在页面的任何地方用iframe嵌入新的页面。

●frame用于全页面,iframe只用于局部页面。

想操作iframe里面的元素,就要先切换到这个iframe上,然后进行操作;想操作iframe外面的元素,就必须跳出这个iframe。对于嵌套的iframe,进去的时候一层层进,出来的时候可以一层层出,也可以直接跳到最外层。

4种从Web页面切换到iframe的方法。

●通过id切换(iframe有id属性):driver.switch_to.frame('iframe1')。

●通过name切换(iframe有name属性,且唯一):driver.switch_to.frame('name1')。

●通过index切换(index从0开始,即0代表页面中第一个iframe):driver.switch_to.frame(0)。

●通过定位元素切换:driver.switch_to.frame(iframe_element)。

切换到父级iframe的方法:switch_to. parent_frame

切换到主窗口的方法:switch_to.default_content

from selenium import webdriver
from time import sleep
import os

driver = webdriver.Chrome()
html_file = 'File:///' + os.getcwd() + os.sep + 'myhtml6_8.html'
driver.get(html_file)
driver.switch_to.frame(0) # 切换到第一个iframe
driver.find_element_by_id('kw').send_keys('Storm') # 输入"Storm"
# driver.switch_to.parent_frame()  # 切回上一级页面
driver.switch_to.default_content() # 直接切回主页面
sleep(2)
driver.switch_to.frame(1) # 切换到第二个iframe
driver.find_element_by_id('kw').send_keys('Shadow') # 输入"Shadow"

sleep(2)
driver.quit()

11.JavaScript弹窗

JavaScript弹窗有3种:Alert、Confirm、Prompt

操作Alert弹窗示例代码:

from selenium import webdriver
from time import sleep
import os

driver = webdriver.Chrome()
html_file = 'File:///' + os.getcwd() + os.sep + 'myhtml6_9.html'
driver.get(html_file)
driver.find_element_by_name('b1').click() # 单击按钮打开Alert弹窗
sleep(1)
print(driver.switch_to.alert.text) # 输出Alert弹窗文字
driver.switch_to.alert.accept() # 单击Alert弹窗中的"确定"按钮
sleep(2)
driver.quit()

操作Confirm弹窗示例代码:

from selenium import webdriver
from time import sleep
import os

driver = webdriver.Chrome()
html_file = 'File:///' + os.getcwd() + os.sep + 'myhtml6_10.html'
driver.get(html_file)
driver.find_element_by_name('b1').click() # 单击按钮打开Confirm弹窗
sleep(2)
print(driver.switch_to.alert.text) # 输出Confirm弹窗文字
sleep(2)
driver.switch_to.alert.accept() # 单击Confirm弹窗中的"确定"按钮
sleep(2)
driver.find_element_by_name('b1').click() # 单击按钮打开Confirm弹窗
sleep(1)
driver.switch_to.alert.dismiss() # 单击Confirm弹窗中的"取消"按钮
sleep(2)
driver.quit()

操作Prompt弹窗示例代码:

from selenium import webdriver
from time import sleep
import os

driver = webdriver.Chrome()
html_file = 'File:///' + os.getcwd() + os.sep + 'myhtml6_11.html'
driver.get(html_file)
driver.find_element_by_name('b1').click() # 单击按钮打开Prompt弹窗
sleep(1)
print(driver.switch_to.alert.text) # 输出Prompt弹窗文字
driver.switch_to.alert.send_keys('storm')
sleep(3)
driver.switch_to.alert.accept() # 单击Prompt弹窗中的"确定"按钮
sleep(2)
driver.find_element_by_name('b1').click() # 单击按钮打开Prompt弹窗
sleep(1)
driver.switch_to.alert.send_keys('shadow')
sleep(1)
driver.switch_to.alert.dismiss()
sleep(2)
driver.quit()

12.文件下载

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>文件下载</title>
</head>
<body>
<a href="storm.rar" download="storm.rar">下载</a>
</body>
</html>
from selenium import webdriver
from time import sleep
import os

driver = webdriver.Chrome()
html_file = 'File:///' + os.getcwd() + os.sep + 'myhtml6_13.html'
driver.get(html_file)
sleep(2)
driver.find_element_by_tag_name('a').click()
sleep(5)
driver.quit()

下载到指定路径:

Chrome浏览器:

from selenium import webdriver
from time import sleep
import os

chromeOptions = webdriver.ChromeOptions() # 定义变量,存储Chrome浏览器的设置项
prefs = {"download.default_directory": "D:\\A\\"}  # 指定默认下载路径
chromeOptions.add_experimental_option("prefs", prefs) # 将prefs定义的下载路径应用于浏览器设置
driver = webdriver.Chrome(chrome_options=chromeOptions) # 以自定义的设置项启动浏览器
html_file = 'File:///' + os.getcwd() + os.sep + 'myhtml6_13.html'
driver.get(html_file)
sleep(2)
driver.find_element_by_tag_name('a').click()
sleep(5)
driver.quit()

Firefox浏览器:

from selenium import webdriver
from time import sleep

'''
browser.download.dir:指定下载路径
browser.download.folderList:设置成2表示使用自定义下载路径,设置成0表示下载到桌面,设置成1表示下载到默认路径
browser.download.manager.showWhenStarting:在开始下载时是否显示下载管理器
browser.helperApps.neverAsk.saveToDisk:对所给出的文件类型不再出现弹窗进行询问
'''
profile = webdriver.FirefoxProfile()
profile.set_preference('browser.download.dir', 'd:\\')
profile.set_preference('browser.download.folderList', 2)
profile.set_preference('browser.download.manager.showWhenStarting', False)
profile.set_preference('browser.helperApps.neverAsk.saveToDisk', 'application/zip')
driver = webdriver.Firefox(firefox_profile=profile)
driver.get('http://sahitest.com/demo/saveAs.htm')
driver.find_element_by_xpath('//a[text()="testsaveas.zip"]').click()
sleep(3)
driver.quit()

确认文件下载成功

from selenium import webdriver
from time import sleep
import os

if os.path.exists("D:\\A\\storm.rar"):   # 先判断文件是否存在
      os.remove("D:\\A\\storm.rar")      # 如果存在则删除

chromeOptions = webdriver.ChromeOptions() # 定义变量,存储Chrome浏览器的设置项
prefs = {"download.default_directory": "D:\\A\\"}  # 指定默认下载路径
chromeOptions.add_experimental_option("prefs", prefs) # 将prefs定义的下载路径应用于浏览器设置
driver = webdriver.Chrome(chrome_options=chromeOptions) # 以自定义的设置项启动浏览器
html_file = 'File:///' + os.getcwd() + os.sep + 'myhtml6_13.html'
driver.get(html_file)
sleep(2)
driver.find_element_by_tag_name('a').click()
sleep(5)  # 等待下载完成,然后再去判断文件是否存在
if os.path.exists("D:\\A\\storm.rar"): # 判断文件是否存在
      print("文件下载成功")
driver.quit()

计算文件md5值

from selenium import webdriver
from time import sleep
import os
from Chapter_6.get_file_md5 import get_md5

if os.path.exists("D:\\A\\storm.rar"):    # 先判断文件是否存在
      os.remove("D:\\A\\storm.rar")       # 如果存在则删除

chromeOptions = webdriver.ChromeOptions() # 定义变量,存储Chrome浏览器的设置项
prefs = {"download.default_directory": "D:\\A\\"}  # 指定默认下载路径
chromeOptions.add_experimental_option("prefs", prefs) # 将prefs定义的下载路径应用于浏览器设置
driver = webdriver.Chrome(chrome_options=chromeOptions) # 以自定义的设置项启动浏览器
html_file = 'File:///' + os.getcwd() + os.sep + 'myhtml6_13.html'
driver.get(html_file)
sleep(2)
driver.find_element_by_tag_name('a').click()
sleep(5)  # 等待下载完成,然后再去判断文件是否存在
if os.path.exists("D:\\A\\storm.rar"): # 先判断文件是否存在
      file_md5 = get_md5("D:\\A\\storm.rar")
      if file_md5=="6c17852b255374e8d9dc7c7c6a8c2b0d":
             print('下载文件的md5值正确')
driver.quit()

13.文件上传

上传按钮大体上可以分为两种:一种是input控件,另外一种是通过js、flash等实现的且较复杂的非input控件。

<input>标签类型的文件上传按钮的操作:

from selenium import webdriver
from time import sleep
import os

driver = webdriver.Chrome()
html_file = 'File:///' + os.getcwd() + os.sep + 'myhtml6_14.html'
driver.get(html_file)
sleep(2)
driver.find_element_by_id('file').send_keys("D:\\A\\storm.rar")  # 直接传递一个文件
sleep(3)
driver.quit()

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值