前言
在selenium定位元素操作中,如果有些元素定位不到,或者頁(yè)面元素的屬性有需要修改,可以通過(guò)js操作來(lái)對(duì)html頁(yè)面元素獲取、元素屬性獲取、元素的屬性進(jìn)行修改
一、JS執(zhí)行方式
selenium當(dāng)中執(zhí)行js代碼有兩種方式: 1、driver.execute_script(js代碼(語(yǔ)句用;隔開(kāi)),傳入js代碼當(dāng)中的值)
#頁(yè)面滾動(dòng)到可滑動(dòng)最大高度
driver.execute_script("window.scrollTo(0,document.body.scrollHeight)")
2、使用selenium找到的元素對(duì)象,可以傳遞給js代碼 js - argument 對(duì)象:js代碼中使用arguments來(lái)接收參數(shù),可以理解是個(gè)列表,通過(guò)下標(biāo)取值,從0開(kāi)始,根據(jù)參數(shù)的位置
#js代碼中使用arguments來(lái)接收參數(shù),可以理解是個(gè)列表,通過(guò)下標(biāo)取值,從0開(kāi)始,根據(jù)參數(shù)的位置
ele_input = driver.find_element(By.ID,"kw")
ele_button = driver.find_element(By.ID,"su")
js_code = 'arguments[0].value="";' 'arguments[1].click()'
driver.execute_script(js_code,ele_input,ele_button)
二、常用方法舉例
1、js操作滾動(dòng)條
- 設(shè)置滾動(dòng)條位置,距離頂部xxx像素
driver.execute_script("document.documenElement.scrollTop=xx")
- 滑動(dòng)到指定坐標(biāo)位置
- 1、X軸:網(wǎng)頁(yè)左上角,從左到右越來(lái)越大
- 2、Y軸:網(wǎng)頁(yè)左上角,從上到下越來(lái)越大
#滑動(dòng)到頁(yè)面頂部
driver.execute_script("window.scrollTo(0,0)")
- 基于當(dāng)前位置滑動(dòng)指定像素距離
driver.execute_script("window.scrollBy(0,0)")
- 獲取滾動(dòng)條可滑動(dòng)最大寬度
driver.execute_script("document.body.scrollWidth")
- 獲取滾動(dòng)條可滑動(dòng)最大高度
driver.execute_script("document.body.scrollHeight")
- 獲取當(dāng)前滾動(dòng)距離最上方的距離(垂直方向)
driver.execute_script("document.documentElement.scrollTop")
- 獲取當(dāng)前滾動(dòng)距離最左側(cè)的距離(水平方向)
driver.execute_script("document.documentElement.scrollLeft")
2、頁(yè)面需要手動(dòng)將元素滾到可見(jiàn)區(qū)域
兩種方式
- 使用webelement自帶的滾動(dòng)到可見(jiàn)區(qū)域的屬性
ele.location_once_scrolled_into_view #元素與窗口頂端對(duì)齊
- js的方法
arguments[0].scrollIntoView(true) #元素與窗口頂端對(duì)齊 arguments[0].scrollIntoView(false) #元素與窗口底端對(duì)齊
#與窗口頂端對(duì)齊,只要元素在頁(yè)面就可以用,不管元素所屬哪個(gè)滾動(dòng)條
driver.execute_script("arguments[0].scrollIntoView(true)",elem)
#與窗口底部對(duì)齊,只要元素在頁(yè)面就可以用,不管元素所屬哪個(gè)滾動(dòng)條
driver.execute_script("arguments[0].scrollIntoView(false)",elem)
參數(shù)說(shuō)明 scrollIntoView是一個(gè)與頁(yè)面(容器)滾動(dòng)相關(guān)的API element.scrollIntoView() 參數(shù)默認(rèn)為true 參數(shù)為true:調(diào)用該函數(shù),頁(yè)面發(fā)送滾動(dòng),使element的頂部與視圖(容器)頂部對(duì)齊 參數(shù)為false:使element的底部與視圖(容器)底部對(duì)齊
3、js點(diǎn)擊
driver.execute_script("arguments[0].click();",element)
4、js修改value屬性值
driver.execute_script("arguments[0].value = arguments[1].value",ele1,value)
擴(kuò)展
如果鼠標(biāo)從頁(yè)面上某元素移開(kāi),彈出的元素內(nèi)容就整個(gè)消失了,無(wú)法查看其對(duì)應(yīng)的HTML來(lái)定位元素,可使用f12-控制臺(tái)中凍結(jié)彈窗
//表示在 5000毫秒后,執(zhí)行debugger命令。執(zhí)行該命令會(huì)瀏覽器會(huì)進(jìn)入debug狀態(tài)。
//debug狀態(tài)有個(gè)特性,界面被凍住,不管我們?cè)趺袋c(diǎn)擊界面都不會(huì)觸發(fā)事件。
setTimeout(function(){debugger},5000)
注意
接收js執(zhí)行之后的返回值,js代碼中要寫(xiě)return
driver.execute_script("return document.getElementById('Input').value")
|