天天看點

selenium工具之擷取頁面元素的其他資訊

已知元素定位、擷取元素文本

說明:有時需要擷取元素的文本值,做斷言比較,則可以使用元素的text屬性

from selenium import webdriver

driver = webdriver.Chrome()

driver.maximize_window()

driver.get("https://www.baidu.com")

element = driver.find_element_by_xpath("//a[@href='http://news.baidu.com']")

text = element.text
print(text)

driver.quit()
# 列印結果:新聞      

已知元素定位、擷取元素其他屬性

有時元素沒有text屬性(HTML标簽之間的文本值);

selenium工具之擷取頁面元素的其他資訊

而是通過value展示文本值的(通過HTML的value屬性名實作文本值);

selenium工具之擷取頁面元素的其他資訊

那麼可以擷取其它屬性方法: get_attribute("屬性") ,這裡的屬性參數可以是 class、name、value等元素包括的任意屬性名。

from selenium import webdriver

driver = webdriver.Chrome()

driver.maximize_window()

driver.get("https://www.baidu.com")

element = driver.find_element_by_id("su")

text = element.get_attribute("value")
print(text)

driver.quit()
# 列印結果:百度一下      

已知元素定位、擷取元素标簽名

from selenium import webdriver

driver = webdriver.Chrome()

driver.maximize_window()

driver.get("https://www.baidu.com")

element = driver.find_element_by_id("su")
print(element.tag_name)

driver.quit()
# 列印結果:input      

擷取浏覽器名字

方法:name
 
執行個體:drvier.name      

擷取浏覽器目前頁面title

方法:driver.title

執行個體:driver.title      

擷取整個頁面元素

print(browser.page_source)      

擷取目前頁面的url

方法:current_url
 
執行個體:driver.current_url      

說明:在python自動化測試中,擷取頁面位址使用 current_url() 擷取目前頁面位址;

但在原頁面上點選某個按鈕打開了一個新頁面,如果想要擷取新頁面的url位址就不能隻是使用 current_url() 方法,因為此時該方法擷取到的位址還是原頁面位址。

例如:

from selenium import webdriver
import time as t

driver=webdriver.Chrome()

driver.maximize_window()

driver.implicitly_wait(30)

driver.get('http:/www.baidu.com')

# 跳轉到新頁面
driver.find_element_by_link_text('新聞').click()

t.sleep(3)

print('目前浏覽位址為:.{0}'.format(driver.current_url))  # 目前浏覽器位址為:www.baidu.com

driver.quit()      

添加定位頁面代碼之後再使用 current_url() 擷取新頁面的位址即可。

from selenium import webdriver
import time as t

driver=webdriver.Chrome()

driver.maximize_window()

driver.implicitly_wait(30)

driver.get('http:/www.baidu.com')

# 跳轉到新頁面
driver.find_element_by_link_text('新聞').click()

#切換目前頁面标簽
driver.switch_to.window(driver.window_handles[1])

t.sleep(3)

print('目前浏覽位址為:.{0}'.format(driver.current_url)) # 目前浏覽器位址為:http://news.baidu.com

driver.quit()      

已知元素定位、擷取元素坐标位置

driver = webdriver.Firefox()

element = driver.find_element_by_xpath("//someXpath")

location = element.location

print(location)  # {'y': 202, 'x': 165}      

已知元素定位、擷取元素大小

driver = webdriver.Firefox()

element = driver.find_element_by_xpath("//someXpath")

location = element.location
size = element.size

print(size) # {'width': 77, 'height': 22}      

表單的送出

方法:submit
 
解釋:查找到表單(form)直接調用submit即可
 
執行個體:driver.find_element_by_id("form1").submit()      

已知元素定位、擷取元素CSS的屬性值

方法:value_of_css_property(css_name)
 
執行個體:driver.find_element_by_css_selector("input.btn").value_of_css_property("input.btn")      

已知元素定位、擷取元素的tagName(元素标簽名)

方法:tag_name 
 
執行個體:driver.find_element_by_id("iptUsername").tag_name

傳回值:定位的元素的标簽名 如p div标簽      

删除浏覽器所有的cookies

方法:delete_all_cookies()
 
執行個體:driver.delete_all_cookies()      

删除浏覽器指定的cookies

方法:delete_cookie(name)
 
執行個體:deriver.delete_cookie("my_cookie_name")      

傳回目前會話中的cookies

方法:get_cookies()
 
執行個體:driver.get_cookies()      

根據cookie name 查找映射Value值

方法:driver.get_cookie(cookie_name)
 
執行個體:driver.get_cookie("NET_SessionId")      

關閉目前浏覽器頁面(浏覽器驅動并未殺死)

方法:close()  指目前頁面
 
執行個體:driver.close()      

關閉浏覽器并且退出驅動程式(殺死浏覽器驅動)

方法:quit() 
 
執行個體:driver.quit()      

浏覽器回退操作

方法:back()
 
執行個體:driver.back()      

清空輸入框操作

方法:clear()
 
執行個體:執行個體:driver.find_element_by_id("iptUsername").clear()      

浏覽器視窗最大化

方法:maximize_window()
 
執行個體:driver.maximize_window()      

浏覽器設定視窗大小

browser.set_window_size(300,300)      

擷取目前浏覽器視窗的坐标

方法:get_window_position()
 
執行個體:driver.get_window_position()      

擷取目前浏覽器視窗的長和寬(擷取浏覽器視窗大小)

方法:get_window_size()
 
執行個體:driver.get_window_size()      

切換浏覽器視窗

# 切換不同的tab頁

方法:driver.switch_to.window(window_name)

# 備注:從A頁跳轉到B頁,句柄已經切換過去,但是焦點沒有切過去,是以需要switch_to.window,把焦點也切過去,才可以在目前頁進行操作。

# 切換是思路,擷取所有的句柄,因為傳回是一個list,而且要切換的對象都是最後一個,可以使用[-1]直接切過去

# 例如:

driver.switch_to.window(driver.window_handles[-1])      

傳回最外層表單

方法: driver.switch_to_default_content() # 舊方法

driver.switch_to.default_content() # 新方法      

切換至指定frame架構中

方法:driver.switch_to.frame('xxx')

執行個體:

driver.switch_to.frame('frame_name')

driver.switch_to.frame(index)

driver.switch_to.frame(driver.find_elements_by_tag_name("iframe")[0])      

滑鼠焦點切換到浏覽器中的彈窗

方法:driver.switch_to_alert()

執行個體:driver.switch_to_alert()      

浏覽器前進

方法:

driver.forward()      

浏覽器後退

browser.back()      

重新整理浏覽器頁面

方法:driver.refresh()      

浏覽器警告框處理

selenium工具之擷取頁面元素的其他資訊

執行個體1

"""警告框處理"""

# 擷取警告框文本資訊
AlertText = driver.switch_to.alert.text
print(AlertText)
# 模拟點選确定操作
driver.switch_to.alert.accept()
# 模拟點選取消操作
driver.switch_to.alert.dismiss()      

執行個體2

try:
    tt = browser.switch_to_alert()
    print("列印警告框提示...")
except Exception as e:
    print("faild")

success_text = tt.text
print(success_text)
tt.accept()      

去除頁面元素的隻讀屬性(readonly)

"""去除隻讀屬性"""
#執行個體12306,日期選擇

# 移除readonly屬性
js_readonly = 'document.getElementById("train_date").removeAttribute("readonly");'

driver.execute_script(js_readonly)
# 清空 開始日期
# driver.find_element_by_id("train_date").clear()
# 輸入新的日期
# driver.find_element_by_id("train_date").send_keys("2020-05-01")      

頁面input框利用send_keys上傳圖檔

#F:\dd.jpg 為本地圖檔路徑
driver.find_element_by_id("file_select").send_keys("F:\dd.jpg")      

複選框操作

Len()方法可以用來計算元素的個數

click()方法是對某個元素進行勾選;

pop().click(),其實是對某個元素取消勾選

如果隻想勾選一組元素中的某一個該如何操作呢?
pop()或pop(-1):      預設擷取一組元素中的最後一個。
pop(0):                  預設擷取一組元素中的第一個。
pop(1):                 預設擷取一組元素中的第二個。

這樣就可以操作這一組元素中的任意一個元素了,隻需數一數需操作的元素是這一組中的第幾個。      

滾動條操作

"""浏覽器滾動條并沒有提供相應的操作方法。在這種情況下,就可以借助JavaScript來控制浏覽器的滾動條。 WebDriver提供了execute_script()方法來執行JavaScript代碼。"""

js="window.scrollTo(0,2500);" #0為起始,2500為終點
driver.execute_script(js)

js = 'window.scrollTo(0,document.body.scrollHeight)' # 滾動到浏覽器底部
driver.execute_script(js)
time.sleep(2)

js = 'window.scrollTo(0,document.body.scrollTop=0)' # 滾動到浏覽器頂部
driver.execute_script(js)      

元素聚焦

"""雖然用上面的方法可以解決拖動滾動條的位置問題,但是有時候無法确定我需要操作的元素在什麼位置,有可能每次打開的頁面不一樣,元素所在的位置也不一樣,怎麼辦呢?這個時候我們可以先讓頁面直接跳到元素出現的位置,然後就可以操作了。同樣需要借助JS去實作。"""

target = driver.find_element_by_xxxx()
driver.execute_script("arguments[0].scrollIntoView();", target)      

設定網絡

print(browser.set_network_conditions(
                offline=False,
                latency=5,  # additional latency (ms)
                download_throughput=500 * 1024,  # maximal throughput
                upload_throughput=500 * 1024)  # maximal throughput)
            )      

指定浏覽器驅動位置(或者将驅動設定為環境變量)

from selenium import webdriver

browser = webdriver.Chrome(executable_path="/Users/xinxi/PycharmProjects/selenium_demo/webdriver/chromedriver_mac")
# executable_path來指定chromedirver路徑
browser.get('https://www.baidu.com')      

儲存截圖(截取目前浏覽器頁面頁面)

browser.save_screenshot("/Users/xinxi/PycharmProjects/selenium_demo/screen_folder/截圖.png")      

 圖檔流截圖(截取目前浏覽器頁面頁面)

sc_str = browser.get_screenshot_as_png()

sc_path = "/Users/xinxi/PycharmProjects/selenium_demo/screen_folder/截圖.png"
with open(sc_path,"w") as f:
    f.write(sc_str)      

base_64截圖(截取目前浏覽器頁面頁面)

sc_str = browser.get_screenshot_as_base64()

html_tmp = """
<html>
<body>

<h1>這是一個截圖</h1>
<img src="data:image/png;base64,{}"/>
</body>
</html>
""".format(sc_str)

html_path = "/Users/xinxi/PycharmProjects/selenium_demo/screen_folder/截圖.html"
with open(html_path,"w") as f:
    f.write(html_tmp)      

效果如下: