高德地圖可以搜索國外嗎360搜索引擎優(yōu)化
新建項目
New Project
新建一個python代碼文件
file-new-python file 會自動創(chuàng)建一個.py后綴的代碼文件
注意:命名規(guī)則,包含字母、數(shù)字、下劃線,不能以數(shù)字開頭,不能跟python關(guān)鍵字或包名重復(fù)。
********************華麗分割線******************************************************
pycharme常用功能
1.注釋:
? ? ? ? 單行注釋:以#+一個空格開頭??旖萱I:光標(biāo)放在需要注釋的行,Ctrl+/即可將本行全部注釋掉
? ? ? ? 多行注釋:使用三個雙引號包裹起來的內(nèi)容,可以隨意換行,都是注釋
? ? ? ? ? ? ? ? ? ? ? ? 通常用于文件開頭,描述該文件所寫內(nèi)容概括,或用于文檔注釋
? ? ? ? ? ? ? ? ? ? ? ? 什么是文檔注釋:寫在類或方法的聲明代碼的下一行,用來描述類或函數(shù)的功能或注意事項的注釋,稱為文檔注釋.
2.波浪線
? ? ? ? 紅色:表示代碼存在邏輯錯誤或依賴錯誤,無法執(zhí)行.必須處理
? ? ? ? 黃色:表示代碼存在引用錯誤或使用格式錯誤,缺少參數(shù)等,影響執(zhí)行結(jié)果,必須處理
? ? ? ? 灰色:表示代碼格式不符合PEP8規(guī)范,存在格式錯誤,不影響代碼執(zhí)行,使用Ctrl+Alt +L可以自動調(diào)整格式符合PEP8規(guī)范.
? ? ? ? 綠色:表示代碼存在單詞拼寫錯誤,不影響代碼執(zhí)行
3.快速導(dǎo)包
? ? ? ? 當(dāng)代碼需要導(dǎo)包時,將光標(biāo)移動到需要導(dǎo)包的關(guān)鍵字上,Ctrl+Alt+Enter或Ctrl+Alt+空格鍵,可以實現(xiàn)自動導(dǎo)包
************************華麗分割線**********************************************
WebUI自動化基礎(chǔ)代碼
Web自動化代碼實現(xiàn)基本邏輯
1.導(dǎo)包:導(dǎo)入webdriver包(熟練以后可以先不導(dǎo)包,寫到webdriver以后使用自動導(dǎo)包)
2.實例化瀏覽器對象:使用webdriver的不同驅(qū)動類,實例化一個瀏覽器對象,使用一個變量接受,供后續(xù)調(diào)用.通常將此變量命名為driver(具有明顯意義代指瀏覽器驅(qū)動的實例化對象,好記,也方便其他人閱讀)
3.使用瀏覽器對象,調(diào)用get()方法,打開想要測試的頁面
? ? ? ? 注意:get()的參數(shù)是URL,必須攜帶協(xié)議,如果使用本地文件則注意(\在python代碼中被識別為轉(zhuǎn)義字符,如果本地文件路徑是\形式則需要在URL字符串前加一個r,將\修飾為原始字符?;蛘咴赲前再加一個\,將\轉(zhuǎn)義)最簡單的方式是,先用瀏覽器打開該界面,在瀏覽器地址欄復(fù)制URL,這時候復(fù)制的內(nèi)容就是瀏覽器可以理解的形式了。
4.瀏覽器打開時默認是小窗口模式,為方便測試操作,使用瀏覽器對象調(diào)用maximize_window()方法,將窗口最大化.
5.為防止網(wǎng)頁加載緩慢導(dǎo)致元素定位失敗,添加一個等待代碼,在元素未加載時等待元素加載完成.
6.實現(xiàn)測試需求
7.測試結(jié)束后關(guān)閉瀏覽器,防止瀏覽器打開過多導(dǎo)致電腦崩潰
# 導(dǎo)包
from time import sleepfrom selenium import webdriver# 實例化瀏覽器對象
driver = webdriver.Chrome()
# 打開瀏覽器
driver.get('https://www.baidu.com')
# 展示效果
sleep(1)
# 瀏覽器窗口最大化
driver.maximize_window()
# 隱式等待
driver.implicitly_wait(10)
sleep(2)
# 實現(xiàn)需求# 關(guān)閉瀏覽器
driver.quit()
元素定位
WebUI自動化的最關(guān)鍵內(nèi)容就是,找到想要測試的元素,對元素進行操作
1.獲取元素屬性值
想要編寫元素定位代碼來找到元素,首先我們應(yīng)該先獲取元素的各種屬性值,將這些屬性值作為參數(shù)傳遞給定位方法,那么,我們該如何獲取元素的屬性值呢?方法如下(以Chrome為例):
方法一:
打開瀏覽器,進入想要測試的頁面,鼠標(biāo)放在在想要測試的元素上右鍵,選擇“檢查”,頁面會自動打開一個代碼顯示欄(開發(fā)者工具),并且自動定位到我們選擇的這個元素的代碼上,這樣就可以看到元素的實際代碼啦。
方法二:
如果遇到某些元素?zé)o法右鍵檢查(即右鍵菜單中沒有“檢查”這一選項),可以在瀏覽器的工具欄點擊三個點的標(biāo)志(頁面右上角)選擇-更多工具-開發(fā)者工具,或者直接在鍵盤按F12鍵,打開開發(fā)者工具。
打開開發(fā)者工具后選擇左上角帶一個小箭頭的圖標(biāo),點擊
這時會進入一個定位模式,直接將鼠標(biāo)放在想定位的元素上,下方代碼就會跟隨鼠標(biāo)的動作自動定位到鼠標(biāo)指的元素。
2.定位元素
selenium框架提供了很多定位元素的方法,共分為以下八種:
? ? ? ? id定位
????????name定位
? ? ? ? class_name定位
? ? ? ? tag_name定位
? ? ? ? link_text定位
? ? ? ? partail_link_text定位
? ? ? ? XPath定位
? ? ? ? CSS定位
(1)id定位:
????????diver.find_element_by_id("元素的id值")
? ? ? ? ? ? ? ? 注意:因為id屬性本身具備唯一性的特點,所以使用id定位一定可以唯一定位到一個元素。所以在進行元素定位時,只要元素有id屬性,則優(yōu)先使用id定位。
(2)name定位:??
????????driver.find_element_by_name('元素的name屬性值')
? ? ? ? ? ? ? ? 注意:使用name定位時一定要保證該元素的name在整個頁面是唯一的,如果不唯一則默認只能找到本頁面name值是這個值的第一個元素。
(3)class_name定位:
????????driver.find_element_by_class_name('元素的class屬性值')
? ? ? ? ? ? ? ? 注意:如果元素有多個class值,只能選擇其中一個(具備全局唯一性的那個)。
(4)tag_name定位:
????????driver.find_element_by_tag_name('元素的標(biāo)簽名')
????????????????注意:使用標(biāo)簽名定位元素,須保證本頁面只有一個該類型的標(biāo)簽,或者要定位的元素是本頁面第一個該類型的標(biāo)簽。
(5)link_text定位:
????????driver.find_element_by_link_text('超鏈接元素的文本值')
? ? ? ? ? ? ? ? 注意:使用link_text定位超鏈接元素(即<a>標(biāo)簽或<p>標(biāo)簽),需要匹配超鏈接文本的全部內(nèi)容。同樣,需要保證超鏈接文本的唯一性。
(6)partail_link_text定位:
????????driver.find_element_by_partial_link_text('超鏈接元素的文本內(nèi)容')
? ? ? ? ? ? ? ? 注意:partial_link_text也可以定位超鏈接元素,需要匹配的是超鏈接文本的部分內(nèi)容,要保證匹配的內(nèi)容在頁面具有唯一性。
代碼示例:
# 導(dǎo)包
from time import sleepfrom selenium import webdriver# 實例化瀏覽器對象
driver = webdriver.Chrome()
# 打開瀏覽器
driver.get('https://www.baidu.com')
# 展示效果
sleep(1)
# 瀏覽器窗口最大化
driver.maximize_window()
# 隱式等待
driver.implicitly_wait(10)
sleep(2)
# 使用id定位百度首頁搜索框,并輸入搜索內(nèi)容Auto_test
driver.find_element_by_id("kw").send_keys('Auto_test')
sleep(1)# 清除以上輸入內(nèi)容,方便再次輸入
driver.find_element_by_id("kw").clear()
# 使用name定位百度首頁搜索框,輸入find_name
driver.find_element_by_name('wd').send_keys('find_name')
sleep(1)# 使用class定位百度首頁搜索按鈕,并點擊
driver.find_element_by_class_name('s_btn').click()
sleep(1)# 以上操作已經(jīng)進入搜索結(jié)果頁了,回退到百度首頁方便后續(xù)動作
driver.back()
sleep(1)
# 使用tag_name定位百度首頁設(shè)置按鈕,并獲取它的文本信息
span = driver.find_element_by_tag_name('span') # 因為已經(jīng)確認過設(shè)置是首頁的第一個span標(biāo)簽,所以可以使用標(biāo)簽名定位
print('獲取的span標(biāo)簽的文本內(nèi)容為:', span.text)# 使用link_text定位百度首頁的新聞超鏈接,并獲取它的文本信息
news_link = driver.find_element_by_link_text('新聞')
print('新聞鏈接的文本內(nèi)容是:',news_link.text)# 使用partial_link_text定位百度首頁網(wǎng)盤超鏈接,并獲取它的文本信息
link1 = driver.find_element_by_partial_link_text('網(wǎng)')
print('網(wǎng)盤超鏈接的文本內(nèi)容是:',link1.text)
sleep(2)
# 關(guān)閉瀏覽器
driver.quit()
(7)使用XPath定位:
? ? ? ? 使用XPath定位元素可以分為以下幾種:
? ? ? ? ①絕對路徑:從/html開始逐級查找元素
????????/html/body/div[2]/div[1]/div[5]/div/div/form/span[1]/input
? ? ? ? ? ? ? ? /html是頁面最外層,可以理解為樹形結(jié)構(gòu)的根。/body表示/html內(nèi)的body路徑。div[2]表示/html/body路徑下的第二個div。依此類推。
? ? ? ? ②相對路徑:從能夠唯一定位的一個元素開始,相對這個元素查找元素
????????//input[@id="kw"]
? ? ? ? ? ? ? ? 該元素本身就可以直接定位到,所以相對路徑就是ta自己
? ? ? ? ③利用元素屬性://標(biāo)簽名[@屬性名="屬性值"]
????????????????//input[@id="kw"]
? ? ? ? ? ? ? ? 意思是,匹配id值為kw的input標(biāo)簽
????????//*[@id="kw"]
? ? ? ? ? ? ? ? 使用通配符*,意思是,匹配id值為kw的所有標(biāo)簽
? ? ? ? ? ? ? ? 注意:
????????????????????????此處如果使用class定位,如果class有多個值,則需要填寫class的全部值
? ? ? ? ? ? ? ? ? ? ? ? 屬性前必須要有@前綴修飾
? ? ? ? ④利用屬性與邏輯結(jié)合://標(biāo)簽名[@屬性名1="屬性值1" and @屬性名2="屬性值2"]
? ? ? ? ? ? ? ? 利用邏輯運算符:and or not,對多個屬性條件進行邏輯運算作為判斷條件,查找元素。
? ? ? ? ? ? ? ? 解決了元素屬性值相同問題。
????????????????(舉個實例理解:到一個地方找某人,他叫張三。但是這個地方有很多個叫張三的人,不知道你到底找哪一個。再加上他是一個啞巴這個特征,就可以找到你想找的張三了。如果這個地方剛好有兩個叫張三的啞巴,那再加上他有六根手指頭這個特點……依此類推直到找到張三)
? ? ? ? ⑤利用屬性與層級結(jié)合:
? ? ? ? ? ? ? ? 如果無法直接定位一個元素,但是可以定位到它的父級或祖級元素,則可以利用屬性定位到它的父級或祖級元素,再通過它與父祖級元素的相對路徑關(guān)系來定位該元素。
? ? ? ? ? ? ? ? (舉個實例理解:你想找一個人,不知道他叫什么,也不知道他的任何信息,但是你知道他爸爸或者他爺爺或者他家某一代祖先是誰(父類或祖類),并且他家有家譜(路徑)。那么你就可以說,我找某某某的兒子/孫子/第幾代孫子甚至可以明確指定,找這個人的第幾個兒子/第幾個孫子。參考絕對路徑的解析方法理解一下)
? ? ? ? ⑥擴展:
? ? ? ? //*[text()="XXX"]? ? ? ? 元素文本內(nèi)容等于XXX的
? ? ? ? //*[centains(@屬性名,"XXX")]? ? ? ? 元素屬性包含XXX的
? ? ? ? //*[starts_with(@屬性名,"XXX")]? ? ? ? 元素屬性以XXX開頭的
代碼示例:
# 導(dǎo)包
from time import sleepfrom selenium import webdriver# 實例化瀏覽器對象
driver = webdriver.Chrome()
# 打開瀏覽器
driver.get('https://www.baidu.com')
# 展示效果
sleep(1)
# 瀏覽器窗口最大化
driver.maximize_window()
# 隱式等待
driver.implicitly_wait(10)
sleep(2)# 使用絕對路徑查找百度首頁搜索框,并輸入搜索內(nèi)容
element1 = driver.find_element_by_xpath('/html/body/div[2]/div[1]/div[5]/div/div/form/span[1]/input')
element1.send_keys('000')
sleep(1)# 使用相對路徑查找百度首頁搜索框,并輸入內(nèi)容
element1.clear()
driver.find_element_by_xpath('//*[@id="kw"]').send_keys('111')
sleep(1)# 使用屬性查找百度首頁搜索框,并輸入內(nèi)容
element1.clear()
driver.find_element_by_xpath('//*[@class="s_ipt"]').send_keys('222')
# 為了和上一步的相對路徑區(qū)分開,我使用了class屬性定位,只要能保證唯一性,用那個屬性都可以
sleep(1)# 使用屬性與邏輯結(jié)合查找百度搜索框
element1.clear()
driver.find_element_by_xpath('//*[@class="s_ipt" and @id="kw"]').send_keys('333')
sleep(1)# 使用屬性與層級結(jié)合查找百度搜索按鈕并點擊
driver.find_element_by_xpath('//*[@id="s_btn_wr"]/input').click()
sleep(1)# //*[text()='XXX'] 文本內(nèi)容等于XXX的元素
driver.find_element_by_xpath('//*[text()="百度首頁"]').click() # 從搜索頁返回百度首頁
sleep(2)
# //*[contains(@屬性名,'XXX')] 屬性值中含有XXX的元素,前后缺省都可以
driver.find_element_by_xpath('//*[contains(@class,"ot-refresh")]').click() # 熱搜換一換
sleep(2)
# //*[starts-with(@屬性名,'XXX')] 屬性值以XXX開頭的元素
driver.find_element_by_xpath('//*[starts-with(@class,"hot-refresh")]').click() # 熱搜換一換
sleep(2)
# 祖輩和后代: //element祖//element后代 ://表示任意層級
driver.find_element_by_xpath('//*[@id="form"]//*[@name="wd"]').send_keys('000')# 關(guān)閉瀏覽器
driver.quit()
(8)CSS定位:
? ? ? ?selenium框架推薦使用CSS定位,這種定位方法效率更高,功能更強大。?使用CSS定位可以分為以下幾種:
? ? ? ? ①使用元素id定位
????????find_element_by_css_selector('#id值')
? ? ? ? ②使用元素class定位
????????????????find_element_by_css_selector('.class屬性值')
? ? ? ? ? ? ? ? 注意:如果class有多個值,需要選擇具有唯一性的一個
? ? ? ? ③使用元素標(biāo)簽名定位
????????????????find_element_by_css_selector('標(biāo)簽名')
? ? ? ? ? ? ? ? 注意:確保該元素是頁面唯一的該類型標(biāo)簽時可以用標(biāo)簽名定位
? ? ? ? ④使用元素屬性定位
????????????????find_element_by_css_selector('[屬性名 ="屬性值"]')
? ? ? ? ⑤使用元素屬性與層級結(jié)合定位(原理與Xpath層級定位相似)
? ? ? ? ? ? ? ? 元素A>元素B:AB為父子關(guān)系
? ? ? ? ? ? ? ? 元素A? 元素B:AB為祖孫關(guān)系
? ? ? ? ⑥擴展:
? ? ? ? ? ? ? ? 標(biāo)簽名[屬性名^="XXX"]? ? ? ? 屬性以XXX開頭
? ? ? ? ? ? ? ? 標(biāo)簽名[屬性名$="XXX"]? ? ? ? 屬性以XXX結(jié)尾
? ? ? ? ? ? ? ? 標(biāo)簽名[屬性名*="XXX"]? ? ? ? 屬性包含XXX
? ? ?代碼示例:? ? ? ? ?
# 導(dǎo)包
from time import sleepfrom selenium import webdriver# 實例化瀏覽器對象
driver = webdriver.Chrome()
# 打開瀏覽器
driver.get('https://www.baidu.com')
# 展示效果
sleep(1)
# 瀏覽器窗口最大化
driver.maximize_window()
# 隱式等待
driver.implicitly_wait(10)
sleep(2)
# 使用id查找百度首頁搜索框,并輸入內(nèi)容
driver.find_element_by_css_selector('#kw').send_keys('測試')
sleep(1)# 使用class查找百度搜索“百度一下”按鈕,并點擊
driver.find_element_by_css_selector('.s_btn').click()
sleep(2)# 使用屬性定位,查找搜索結(jié)果頁的搜索框,清空
driver.find_element_by_css_selector('[id="kw"]').clear()
sleep(1)# 使用屬性與層級結(jié)合,查找搜索結(jié)果頁的搜索框,輸入報告
driver.find_element_by_css_selector('#form > span.bg.s_ipt_wr.new-pmd.quickdelete-wrap>input').send_keys('報告')
sleep(2)# 使用擴展方法查找搜索按鈕并點擊
driver.find_element_by_css_selector('input[type^="sub"]').click()
sleep(2)# 關(guān)閉瀏覽器
driver.quit()
? (9)定位一組元素:
????????????????find_elements_by_XXX()
? ? ? ? ? ? ? ? 查找符合要求的一組元素,返回結(jié)果為元素對象組成的列表,想要調(diào)用其中某一個,可以使用列表下標(biāo)
? 代碼示例
# 導(dǎo)包
from time import sleepfrom selenium import webdriver
# 實例化瀏覽器對象
driver = webdriver.Chrome()
# 打開瀏覽器
driver.get('https://kxl.jushispoc.com/#/phonelogin')
# 展示效果
sleep(1)
# find_elements返回的是一個列表,列表的內(nèi)容是多個元素對象.
# find_element返回的是一個元素對象.
elements_list = driver.find_elements_by_class_name('el-input__inner')
# 需求1:將頁面找到的所有輸入框輸入Test
for i in elements_list:i.send_keys('test')
sleep(3)
# 需求2:將找到的第2個輸入框輸入Test666
elements_list[1].send_keys('Test666')
sleep(10)
# 關(guān)閉瀏覽器
driver.quit()
(10)定位元素的更底層寫法
? ? ? ? ? ? ? 導(dǎo)入By類:? find_element(By.查找方法,查找參數(shù))?
? ? ? ? ? ? ? ? 更適用于PO模式封裝時使用,將查找方法與查找參數(shù)封裝在一起,簡化代碼結(jié)構(gòu),當(dāng)前階段了解這種寫法就可以。? ? ?
driver.find_element(By.ID, 'kw').send_keys('333')
? ? ??
? ? ? ??
????????