selenium基本用法

来源:https://www.cnblogs.com/lihongtaoya/archive/2022/08/14/16583548.html
-Advertisement-
Play Games

一.元素操作 send_keys:賦值 clear:清空 click:點擊 from selenium import webdriver from selenium.webdriver.common.by import By driver = webdriver.Chrome() driver.ge ...


一.元素操作

send_keys:賦值

clear:清空

click:點擊

from selenium import webdriver
from selenium.webdriver.common.by import By


driver = webdriver.Chrome()
driver.get("https://www.baidu.com")
driver_css=driver.find_element(by=By.CSS_SELECTOR, value="#kw")
driver_css.send_keys("作者最帥")  # baidu搜索框填下搜索的內容
driver_css.clear()  # 清空搜索的內容
driver.find_element(by=By.CSS_SELECTOR, value="#su").click()  # 點擊搜索
driver.quit()  # 關閉所以視窗

二.視窗操作

maximize_window():視窗最大化

minimize_window():視窗最小化

from selenium import webdriver
from time import sleep


driver = webdriver.Chrome()
driver.get("https://www.baidu.com")
driver.maximize_window()  # 最大化
sleep(3)
driver.minimize_window()  # 最小化
sleep(3)
driver.quit()  # 關閉所以視窗

set_window_size(x,y):設置視窗大小,x為寬,y為高

set_window_position(x,y):設置視窗位置,x橫坐標,y縱坐標

from selenium import webdriver
from time import sleep

driver = webdriver.Chrome()
driver.get("https://www.baidu.com")
driver.set_window_size(100, 600)  # 設置視窗大小
sleep(3)
driver.set_window_position(100, 500)  # 設置視窗位置
sleep(3)
driver.quit()  # 關閉所以視窗

back():後退

forward():前進

refresh():刷新頁面

from selenium import webdriver
from selenium.webdriver.common.by import By
from time import sleep


driver = webdriver.Chrome()
driver.get("https://www.baidu.com")
driver_css=driver.find_element(by=By.CSS_SELECTOR, value="#kw")
driver_css.send_keys("作者最帥")  # baidu搜索框填下搜索的內容
driver.find_element(by=By.CSS_SELECTOR, value="#su").click()  # 點擊搜索
driver.back()  # 後退
sleep(3)
driver.forward()  # 前進
sleep(3)
driver.refresh()  # 刷新
driver.quit()  # 關閉所以視窗

close():關閉當前主視窗(driver.get()打開的視窗)

quit():關閉當前所有視窗

from selenium import webdriver
from selenium.webdriver.common.by import By
from time import sleep


driver = webdriver.Chrome()
driver.get("https://www.baidu.com")
driver.find_element(by=By.XPATH, value="//span[contains(text(),'解碼十年 解鎖出一串發展密碼')]").click()
sleep(3)
driver.close()  # 關閉https://www.baidu.com這個視窗
driver.quit()  # 關閉所有視窗

三.視窗切換

selenium元素定位預設定位的是主視窗,若從主視窗再打開一個視窗的話需要重新切換到指定的視窗才能定位

current_window_handle:獲取當前視窗的window_name

window_handles:獲取所有視窗的window_name值,返回的是list

switch_to.window():切換視窗

from selenium import webdriver
from selenium.webdriver.common.by import By
from time import sleep


driver = webdriver.Chrome()
driver.get("https://www.baidu.com")
driver.find_element(by=By.XPATH, value="//span[contains(text(),'解碼十年 解鎖出一串發展密碼')]").click()
sleep(3)
print(driver.current_window_handle)  # 列印當前視窗的window_name
window_name_list = driver.window_handles  # 獲取當前所有視窗的window_name值
driver.switch_to.window(window_name_list[-1])  # 切換第一個打開的視窗
print(driver.current_window_handle)  # 列印切換後的window_name
driver.quit()  # 關閉所有視窗

這裡需要註意的是switch_to.window(list[下標]):

0:表示切到主視窗

-1:表示切到第一個打開的視窗

-2:表示第二個打開的視窗,依次類推

四.滑鼠操作

double_click():滑鼠雙擊

context_click():滑鼠右擊

click():滑鼠單擊

drag_and_drop(element1,element2):元素拖拽,把element1元素拖拽到element2位置

drag_and_drop_by_offset(element,x,y):元素拖拽,相對於element元素當前位置拖拽到(原x坐標+x,原y坐標+y)

move_to_element(element):滑鼠懸停在element元素位置

move_to_element_with_offset(element,x,y):和drag_and_drop_by_offset作用相同,x,y值可為正負

click_and_hold(element):滑鼠左鍵按住element元素

move_by_offset(x,y):相對於滑鼠按住的位置移動(x,y)

release():釋放按住的滑鼠

註:後三個一般是放在一起使用的。所有的方法都是由ActionChains(driver)實例對象調用

1.模擬滑鼠操作前需要導入對應的包

from selenium.webdriver import ActionChains

2.實例化滑鼠對象

action = ActionChains(driver)

3.執行滑鼠操作

action.perform()

4.實例(element為需要操作的元素)

from selenium import webdriver
from selenium.webdriver.common.by import By
from time import sleep
from selenium.webdriver import ActionChains


driver = webdriver.Chrome()
driver.get("https://www.baidu.com")
action = ActionChains(driver)  # 實例化滑鼠對象
action.double_click(element)  # 雙擊(左鍵雙擊)
action.context_click(element)  # 滑鼠右擊
action.click(element)  # 滑鼠單擊
action.perform()  # 執行滑鼠操作
driver.quit()  # 關閉所有視窗

五.鍵盤操作

1.模擬鍵盤操作前要先導入Keys類

from selenium.webdriver.common.keys import Keys

2.使用時用Keys.的方式去調用Keys類中的屬性

ENTER:enter回車鍵

SPACE:空格鍵

DELETE:刪除鍵

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

driver = webdriver.Chrome()
driver.get("https://www.baidu.com")
driver_css = driver.find_element(by=By.CSS_SELECTOR, value="#kw")
driver_css.send_keys("作者是帥哥")
driver_css.send_keys(Keys.SPACE)  # 列印空格鍵
sleep(2)
driver_css.send_keys(Keys.ENTER)  # 回車搜索
sleep(2)
driver.quit()  # 關閉所有視窗

3.兩鍵組合使用

CONTROL:ctrl鍵

ctrl+a:全選

ctrl+c:複製

ctrl+v:粘貼

ctrl+x:剪切

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

driver = webdriver.Chrome()
driver.get("https://www.baidu.com")
driver_css = driver.find_element(by=By.CSS_SELECTOR, value="#kw")
driver_css.send_keys("作者是帥哥")
driver_css.send_keys(Keys.CONTROL, "a")  # 全選
sleep(1)
driver_css.send_keys(Keys.CONTROL, "c")  # 複製
sleep(1)
driver_css.send_keys(Keys.RIGHT)  # 向右箭頭
sleep(1)
driver_css.send_keys(Keys.CONTROL, "v")  # 粘貼
sleep(1)
driver_css.send_keys(Keys.CONTROL, "a")  # 全選
sleep(1)
driver_css.send_keys(Keys.CONTROL, "x")  # 剪切
sleep(1)
driver.quit()  # 關閉所有視窗 

5.Keys類

class Keys:
    """
    Set of special keys codes.
    """

    NULL = '\ue000'
    CANCEL = '\ue001'  # ^break
    HELP = '\ue002'
    BACKSPACE = '\ue003'
    BACK_SPACE = BACKSPACE  # 刪除
    TAB = '\ue004'  # tab鍵
    CLEAR = '\ue005'
    RETURN = '\ue006'
    ENTER = '\ue007'  # 回車鍵
    SHIFT = '\ue008'  # shift鍵
    LEFT_SHIFT = SHIFT  # shift鍵
    CONTROL = '\ue009'
    LEFT_CONTROL = CONTROL  # ctrl鍵
    ALT = '\ue00a'  # alt鍵
    LEFT_ALT = ALT  # alt鍵
    PAUSE = '\ue00b'
    ESCAPE = '\ue00c'  # esc鍵
    SPACE = '\ue00d'  # 空格鍵
    PAGE_UP = '\ue00e'  # pgup
    PAGE_DOWN = '\ue00f'  # pgdn
    END = '\ue010'  # end
    HOME = '\ue011'  # home
    LEFT = '\ue012'  # 左箭頭
    ARROW_LEFT = LEFT
    UP = '\ue013'  # 上箭頭
    ARROW_UP = UP
    RIGHT = '\ue014'  # 右箭頭
    ARROW_RIGHT = RIGHT
    DOWN = '\ue015'  # 下箭頭
    ARROW_DOWN = DOWN
    INSERT = '\ue016'  # insert
    DELETE = '\ue017'  # del
    SEMICOLON = '\ue018'  # ;鍵
    EQUALS = '\ue019'  # =鍵

    NUMPAD0 = '\ue01a'  # 0-9數字
    NUMPAD1 = '\ue01b'
    NUMPAD2 = '\ue01c'
    NUMPAD3 = '\ue01d'
    NUMPAD4 = '\ue01e'
    NUMPAD5 = '\ue01f'
    NUMPAD6 = '\ue020'
    NUMPAD7 = '\ue021'
    NUMPAD8 = '\ue022'
    NUMPAD9 = '\ue023'
    MULTIPLY = '\ue024'  # *
    ADD = '\ue025'  # +
    SEPARATOR = '\ue026'  # ,
    SUBTRACT = '\ue027'  # -
    DECIMAL = '\ue028'  # .
    DIVIDE = '\ue029'  # /

    F1 = '\ue031'  # F1-F12
    F2 = '\ue032'
    F3 = '\ue033'
    F4 = '\ue034'
    F5 = '\ue035'
    F6 = '\ue036'
    F7 = '\ue037'
    F8 = '\ue038'
    F9 = '\ue039'
    F10 = '\ue03a'
    F11 = '\ue03b'
    F12 = '\ue03c'

    META = '\ue03d'
    COMMAND = '\ue03d'
    ZENKAKU_HANKAKU = '\ue040'

4.key_down和key_up

使用滑鼠事件也可以模擬鍵盤操作,其中用到的就是滑鼠兩個方法key_down和key_up

key_down:模擬鍵盤操作

key_up:釋放key_down按下的鍵

from selenium import webdriver
from selenium.webdriver.common.by import By
from time import sleep
from selenium.webdriver import ActionChains
from selenium.webdriver.common.keys import Keys

driver = webdriver.Chrome()
driver.get("https://www.baidu.com")
driver_css = driver.find_element(by=By.CSS_SELECTOR, value="#kw")
driver_css.send_keys("作者是帥哥")
action = ActionChains(driver)
action.key_down(Keys.CONTROL, element=driver_css).send_keys("a")  # 模擬鍵盤按下ctrl+a
action.key_up(Keys.CONTROL)  # 釋放按住的ctrl鍵
sleep(2)
action.key_down(Keys.DELETE)  # 模擬delete
action.key_up(Keys.DELETE)  # 釋放delete鍵
action.perform()
sleep(2)
driver.quit()  # 關閉所有視窗

六.元素等待

為什麼要設置元素等待:

電腦cpu運行的速度大於網頁載入,會導致一個問題代碼運行到這一步是,網頁還沒有渲染完,出現元素找不到問題。

1.強制等待

不管有沒有找到元素,執行到該步時都會等待設置的秒數

time.sleep(1)

sleep(number):number為等待時長,單位為秒

2.隱性等待

設置全局等待,查找每個元素時如果第一時間沒有找到,就會等待設置的時間(s),超出時間限制後還是沒有找到就會報錯

driver.implicitly_wait(50)

3.顯性等待(具體實現baidou吧)

為單個元素設置等待時長,可設置輪詢時間,既每隔多少s查詢一次,超出設置的最大時間報錯

七.下拉框

我們先來瞭解下html中下拉框的寫法吧,由<select><option></option>/select>組成,源碼和展示如下

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<select id="wq">
    <option value="張三">張</option>
    <option value="李四">李</option>
    <option value="王五">王</option>
</select>
</body>
</html>

個人覺得使用xpth方法定位,利用層級關係也可以正常定位對應的option,那麼既然有專門處理下拉框的方法,也就學習一下

1.導入Select模塊

from selenium.webdriver.support.select import Select

2.實例化下拉框對象

sele = Select(driver_id)

返回的是一個list集合

3.定位option的方法

select_by_index(下標):根據下標定位對應的option

select_by_value(value值):根據option中value屬性值定位

select_by_visible_text(選項值):根據對應的option選項值定位

from selenium import webdriver
from selenium.webdriver.common.by import By
from time import sleep
from selenium.webdriver.support.select import Select

driver = webdriver.Chrome()
driver.get("url")
driver_css = driver.find_element(by=By.CSS_SELECTOR, value="#wq")
select = Select(driver_css)  # 實例化select對象
select.select_by_index(1)  # 根據下標定位
sleep(1)
select.select_by_value("王五")  # 根據value值定位
sleep(1)
select.select_by_visible_text("張")  # 根據選項值定位
sleep(1)
driver.quit()  # 關閉所有視窗

4.既然有選擇下拉框的方法,那麼也少不了取消選擇下拉框的方法

sele.deselect_all():取消全部選擇

sele.deselect_by_index():根據下標取消選擇

sele.deselect_by_value():根據value值取消選擇

sele.deselect_by_visible_text():根據text取消選擇

註:不做演示了,該方法要在對應的選項選中後才可取消選擇,且只適用於多選的下拉框試用。帶multiple屬性值的

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<select id="wq" multiple>
    <option value="張三">張</option>
    <option value="李四">李</option>
    <option value="王五">王</option>
</select>
</body>
</html>

八.三種彈框

1.js提供了三種彈框,這裡不做多餘介紹了,三種彈框的使用方法相同

alert():只含確定的選項的彈框

confirm():含確定和取消的彈框

prompt():可輸入內容的彈框

2.方法使用

alert = driver.switch_to.alert : 切換彈框

alert.send_keys("老子是無敵的") : 針對prompt彈框輸入內容

print(alert.text) : 獲取彈框文本

alert.dismiss() : 取消(alert不含取消選項,既dismiss和accept效果相同)

alert.accept() : 同意

九.滾動條

我們在一個頁面操作元素時,如果頁面有下滾動條的話,進入該視窗視窗內展示的是最上面的內容,如果定位到

最底部的話,操作元素是看不到效果的。此外,selenium是不提供滾動效果的,但提供了運行js腳本的方法,所

以可以通過寫js語法來滾動

1.方法使用

js = 'window.scrollTo(0,100)' : 下滑到指定位置,x水平,y垂直

js='window.scrollTo(0,document.body.scrollHeight)' : 滑到頁面底部

driver.execute_script(js) : 執行js腳本

十.frame表單

frame其實和切換視窗差不多,進入頁面時只會預設定位一個iframe,若想操作其它iframe的元素,需要手動切換

driver.switch_to.frame("id/name/element") : 切換到iframe表單

driver.switch_to.default_content("id/name/element") : 回到預設頁面

註:若想從非預設iframe切換到另一個非預設iframe,必須先切回預設的ifrme

十一.截圖

driver.get_screenshot_as_file("./baidu.png")

十二.使用cookie登錄

1.我們以登錄知乎為例,首先要獲取cookie值

 

 2.添加cookie,add_cookie(cookie)

我們進入add_cookie方法源代碼可以看見需要傳遞一個字典類型的值,因此cookie傳入時要以字典的方法傳入

cookies = {
    'name': 'z_c0',
    'value': '獲取的cookie值'}

3.刷新頁面

driver.refresh()

4.完整代碼

from selenium import webdriver
from selenium.webdriver.common.by import By

driver = webdriver.Chrome()
driver.get("https://www.zhihu.com/signin")
cookies = {
    "name": "z_c0",
    "value": "你的知乎cookie值"
}
driver.add_cookie(cookies)  # 添加cookie
driver.refresh()  # 刷新頁面,登錄成功
driver.quit()  # 關閉所有視窗

十三.判斷元素是否可點擊,可使用,已選中

is_selected():判斷元素是否被選中,選中返回true,否則false

is_displayed():判斷端上是否可見,可見返回true,否則返回false

id_enabled():判斷按鈕是否可點擊,可點擊返回true,否則返回false

1.先來看下html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>

<body>
<select id="wq">
    <option>張三</option>
    <option selected="selected">李四</option>  <!--selected設置預設選中-->
</select>
<button type="button" disabled="disabled" id="button">登錄</button>  <!--disabled設置按鈕不可點擊-->
<button type="button" style="display: none">註冊</button>  <!--display: none設置元素不可見-->
</body>
</html>

2.實例

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.select import Select

driver = webdriver.Chrome()
driver.get("html 地址")
driver_css = driver.find_element(by=By.CSS_SELECTOR, value="#wq > option:nth-child(2)")
print(driver_css.is_selected())  # 判斷元素是否被選中
driver_id = driver.find_element(by=By.ID, value="button")
print(driver_id.is_enabled())  # 判斷元素是否可點擊
driver_tag_name = driver.find_elements(by=By.TAG_NAME, value="button")
print(driver_tag_name[1].is_displayed())  # 判斷元素是否可見
driver.quit()  # 關閉所有視窗

十四.其它方法使用

title:獲取當前視窗標題

current_url:獲取當前視窗url

text:獲取元素文本內容

size:獲取元素大小

get_attribute(屬性):獲取屬性值

from selenium import webdriver
from selenium.webdriver.common.by import By

driver = webdriver.Chrome()
driver.get("https://www.baidu.com")
print(driver.title) # 獲取頁面標題
print(driver.current_url) # 獲取頁面url
driver_css = driver.find_element(by=By.CSS_SELECTOR, value="#su")
print(driver_css.get_attribute("id")) # 獲取id值
print(driver_css.size) # 獲取元素大小
print(driver_css.text) # 獲取元素文本
driver.quit() # 關閉所有視窗

十五.常見面試題

1.動態元素如何定位

動態元素分為兩種

(1)元素值部分可變,部分固定

xpath和css定位都提供了模糊匹配,可根據固定部分的值來匹配結果

xpath模糊匹配

driver.find_element(by=By.XPATH, value="//*[contains(@name,'na')").send_keys("作者說帥哥")  # contains匹配含有na的name屬性值
driver.find_element(by=By.XPATH, value="//*[starts-with(@name,'2')").send_keys("12")  # start-with匹配以2開頭的name屬性值
driver.find_element(by=By.XPATH, value="//*[ends-with(@name,'2')").send_keys("12")  # ends-with匹配以2結尾的name屬性值

css模糊匹配

  • 匹配以XX開頭的:value="[id^='head']")
  • 匹配以XX結尾:value="[id$='tail']"
  • 匹配包含XX的:valur="[name*='like']"

(2)元素值都不是固定值

元素值不是固定的,此時用屬性值定位是行不通的,不過可以利用層級關係定位

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>

<body>
<select>
    <option>張三</option>
    <option>李四</option>
</select>

</body>
</html>

  

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.select import Select

driver = webdriver.Chrome()
driver.get("http://localhost:63342/pytest_selenium/lianxi/select.html?_ijt=6s5tqd9kb7fi081s4dl8trmir3")
driver_xpath = driver.find_element(by=By.XPATH, value="/html[1]/body[1]/select[1]/option[2]")
print(driver_xpath.text)
driver.quit()  # 關閉所有視窗

2.如何操作隱藏元素

selenium並沒有提供操作隱藏元素的方法,但是提供了運行js的方法,所以我們可以通過編寫js來操作

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>

<button type="button" style="display: none" id="wq">登錄</button>
<button type="button" style="display: none" name="wq">註冊</button>
</body>
</html>

  

from selenium import webdriver
from time import sleep

driver = webdriver.Chrome()
driver.get("http://localhost:63342/pytest_selenium/lianxi/select.html?_ijt=9o3tjsdmdq67okafpu0u49td4m")
js_id = 'document.getElementById("wq").style.display = "block"'  # 去除隱藏
js_name = 'document.getElementsByName("wq")[0].style.display = "block"'  # 去除隱藏
driver.execute_script(js_id)  # 運行js
sleep(1)
driver.execute_script(js_name)  # 運行js
sleep(1)
driver.quit()  # 關閉所有視窗

十六.Chropath插件

1.下載插件:https://crx4.com/7605.html

2.下載完成後解壓到本地文件夾,打開瀏覽器擴展程式,打開開發者模式

3.點擊載入已解壓的擴展程式,導入即可

 

4.這時我們就可以看見導入的插件了,左側選擇對應的元素,右側chropath  tab下會展示具體的value值

5.chropath不支持切換frame,只能定位預設的frame

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 1.什麼是自定義分頁器 當我們需要在前端頁面展示的數據太多的時候,我們總不能將數據展示在一頁上面吧!這時,我們就需要自定義一個分頁器,將數據分成特定的頁數進行展示,每一頁展示固定條數的數據! 2.為什麼要用自定義分頁器 如上所說:為了將數據分成多頁進行展示,分別閱讀,方便查詢! 3.如何使用自定義分 ...
  • django-rest-framework開發api介面 (1) 創建django項目drfdemo1並且創建一個名為app的應用 django-admin startproject drfdemo1 python manage.py startapp app (2) 安裝django-rest-f ...
  • 1、導入模塊 import requests import csv from concurrent.futures import ThreadPoolExecutor 2、先獲取第一個頁面的內容 分析得到該頁面的數據是從getPriceData.html頁面獲取,並保存在csv文件中 得到url地址 ...
  • 動態規劃的引入 動態規劃(Dynamic Programming,DP)是運籌學的一個分支,是求解決策過程最優化的過程。20世紀50年代初,美國數學家貝爾曼(R.Bellman)等人在研究多階段決策過程的優化問題時,提出了著名的最優化原理,從而創立了動態規劃。動態規劃的應用極其廣泛,包括工程技術、經 ...
  • 1. 認識RabbitMQ 1.1介紹RabbitMQ RabbitMQ 是開源的高級消息隊列協議(Advanced Message Queueing Protocol, AMQP) 的實現,用Erlang 語言編寫,支持多種客戶端。 RabbitMQ是目前應用相當廣泛的消息中間件(其他同類的消息處 ...
  • 你必須非常努力,才能看起來毫不費力! 微信搜索公眾號[ 漫漫Coding路 ],一起From Zero To Hero ! 前言 日常 Go 開發中,Context 包是用的最多的一個了,幾乎所有函數的第一個參數都是 ctx,那麼我們為什麼要傳遞 Context 呢,Context 又有哪些用法,底 ...
  • 最近在看C語言代碼時碰到了這個問題,結合查找的資料對這C的知識點做了一下小結。寫了一份測試它們的代碼。test1函數穿了一個char* const的指針,如果對它增加,會報錯,它是只讀的。但是可以對指針所指位置的內容進行更改。test2函數測試的是const char類型的參數,test3函數測試的 ...
  • java中只有值傳遞 為什麼這麼說?兩個例子: public class Student { int sage = 20; String sname = "雲胡不歸"; public static void change(Student s1) { s1.sname = "荀一"; s1.sage ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...