Node.js結(jié)合selenium做web自動(dòng)化測(cè)試第九課

又到了Node.js結(jié)合selenium做web自動(dòng)化測(cè)試時(shí)間,今天已經(jīng)到了第九課了,感謝大家的堅(jiān)持和陪伴,今天我們要說的內(nèi)容是切換窗口,拖拽和快捷鍵操作。

拖拽的情況一般可能會(huì)出現(xiàn)在下面這張場(chǎng)景
如果是讓我們手動(dòng)拖,那鐵定是分分鐘的事,so easy,但如果是用自動(dòng)化代碼來實(shí)現(xiàn)怎么辦,selenium上的方法有千萬種,總有一款適合你,找找看吧,拖拽對(duì)應(yīng)的英語單詞是什么?好像隱約的覺得有個(gè)drag吧,模糊查詢一下,就會(huì)自動(dòng)給我們帶出來,dragAndDrop方法

方法里說,首先找到元素,然后拖拽到指定位置,這個(gè)指定位置怎么找呢,用坐標(biāo)軸的形式,x,y軸,好像回到了初中數(shù)學(xué)課嘛,我們一起試一試,首先新建feature文件
瀏覽網(wǎng)站部分的代碼不用解釋了吧
Given(/^瀏覽網(wǎng)址"([^"]*)"$/, async function (url) {

    await driver.get(url)
});

拖拽部分的還是要一步一步慢慢來滴,開始要先定位元素

這個(gè)滑塊的屬性在這里,找到它的id屬性值了

When(/^拖拽驗(yàn)證碼塊到最右側(cè)$/, async function () {
    
    let div = await driver.findElement({ id: 'nc_1_n1z' })
});

API里剛才說dragAndDrop(from,to),from是拖拽的元素,to是要拖到的位置,這里可以是一個(gè)元素,也可以是x,y軸定位到的地址,那我們先把剛剛定義的div元素位置打印出來看一下

When(/^拖拽驗(yàn)證碼塊到最右側(cè)$/, async function () {

    let div = await driver.findElement({ id: 'nc_1_n1z' })
    console.log("div",div.getLocation())
});

這個(gè)時(shí)候運(yùn)行一下,結(jié)果,你會(huì)大吃一驚,為什么呢,因?yàn)閳?bào)錯(cuò)了

為什么會(huì)報(bào)這個(gè)不靠譜的錯(cuò)呢,回到定位元素那個(gè)步驟
這里有個(gè)iframe,什么鬼?前方高能!插播一條高能知識(shí)點(diǎn)!這里有栗子
我們新建一個(gè)html文件,里面先寫入一個(gè)p標(biāo)簽

先在瀏覽器中打開看一下
顯示的是我們寫入的文本信息,沒毛病
下一步,寫入一個(gè)iframe標(biāo)簽
再從瀏覽器中打開
發(fā)現(xiàn)哪里不對(duì)了嗎,就是這里面又嵌入了一個(gè)頁面,iframe標(biāo)簽里寫的頁面,so,剛剛為什么會(huì)出現(xiàn)那個(gè)報(bào)錯(cuò),心里有兩個(gè)數(shù)了吧,所以我們要定位到滑塊首先要做的是切換到iframe再找元素,怎么切換呢,這個(gè)方法switchTo
switchTo后面說了TargetLocator,具體有什么呢

看到有iframe(id),那就用它吧,方法是這樣的

所以,我們?nèi)フ襥frame id
When(/^拖拽驗(yàn)證碼塊到最右側(cè)$/, async function () {
    await driver.switchTo().frame('alibaba-register-box');
    let div = await driver.findElement({ id:'nc_1_n1z' })
    console.log("div",await div.getLocation())
});

運(yùn)行的結(jié)果就給我們打印出坐標(biāo)位置了

然后就是要把它平行移動(dòng)了,我們嘗試讓它移動(dòng)80個(gè)像素,最終完整的代碼就是這樣的,拿去隨意玩吧

var { Given, When, Then } = require('cucumber')
const { driver } = require('../support/web_driver');

Given(/^瀏覽網(wǎng)址"([^"]*)"$/, async function (url) {

    await driver.get(url)
});

When(/^拖拽驗(yàn)證碼塊到最右側(cè)$/, async function () {
    await driver.switchTo().frame('alibaba-register-box');
    let div = await driver.findElement({ id:'nc_1_n1z' })
    console.log("div",await div.getLocation())
    let div_location=await div.getLocation();
    let offset_y=div_location.y+80
    await driver.actions().dragAndDrop(div,{x:div_location.x,y:offset_y}).perform()
});

下面來介紹alert,alert是什么呢,還是用一個(gè)html說,先在html里寫一個(gè)按鈕

這個(gè)按鈕在點(diǎn)擊的時(shí)候會(huì)跳出一個(gè)小對(duì)話框
你會(huì)發(fā)現(xiàn)這個(gè)小窗口用開發(fā)者工具定位根本就選擇不到,那就要看switchTo的alert用法了
新建一個(gè)場(chǎng)景操作一下
When(/^點(diǎn)擊按鈕彈出alert窗口$/, async function () {

    await driver.findElement({tagName:'button'}).click()//定位到按鈕,點(diǎn)擊按鈕
    let text =await driver.switchTo().alert().getText()//獲取彈窗的文本信息
    console.log("text is",text)//打印出彈窗的文本信息
});

Then(/^點(diǎn)擊確定按鈕$/, async function () {

    await driver.switchTo().alert().accept()//彈出的對(duì)話框中點(diǎn)擊確定按鈕
});

結(jié)果的動(dòng)畫大家動(dòng)動(dòng)勤勞的小手演示一下就能看到了

此方法在管理系統(tǒng)刪除配置等操作中應(yīng)用較多
下面一個(gè)場(chǎng)景,我們說一說多個(gè)窗口切換,html文件里準(zhǔn)備一個(gè)跳轉(zhuǎn)頁面的按鈕

<html>

    <p>123456</p>
    <button onclick="alertmes()">click me</button>
    <a >cuketest</a>
    <script>
        function alertmes(){
            alert('abc')
        }
    </script>
</html>

瀏覽器里打開是這樣的

點(diǎn)擊cuketest鏈接,就會(huì)打開一個(gè)新的頁面
但是,盡管打開了新的頁面,界面展示給我們的還是原來帶有按鈕的頁面,那么如果這個(gè)時(shí)候我們要對(duì)新頁面進(jìn)行操作,不如點(diǎn)擊上面的某些按鈕,就無法定位,所以這時(shí)候我們一定要有一個(gè)頁面的切換操作,廢話不說,先建場(chǎng)景
When(/^點(diǎn)擊cuketest$/, async function () {

    await driver.findElement({tagName:"a"}).click()
});

Then(/^打開一個(gè)新的窗口$/, async function () {

    let allwindows=await driver.getAllWindowHandles()
    console.log(allwindows.length)//取到打開的窗口的數(shù)量值
    await driver.switchTo().window(allwindows[1])
    //切換到最后一個(gè)窗口,因?yàn)檫@里打開了兩個(gè)窗口,數(shù)組的排序是從0開始,所以第二個(gè)窗口的索引值是1
});

這里切換好窗口,下面很簡(jiǎn)單,點(diǎn)擊cuketest頁面里的按鈕就好,我們最熟悉的定位.click

Then(/^新的窗口打開文檔$/, async function () {

    await driver.findElement({className:"font-tab"}).click()
});

結(jié)果運(yùn)行一定是Pass,棒棒噠

下面一個(gè)操作跟大家說說快捷鍵,比如說我們的Cnode社區(qū)發(fā)布話題的時(shí)候諸如字體加粗,下劃線其實(shí)都可以在不點(diǎn)擊編輯文字按鈕的情況下使用快捷鍵來設(shè)置,比如加粗可以用ctrl+b
前面的準(zhǔn)備代碼不細(xì)說了,都在之前的筆記里,我們直接去輸入框

鼠標(biāo)放到這里,你會(huì)發(fā)現(xiàn)這里是一個(gè)div,跟之前的input不一樣,所以我們不能直接的sendKeys輸入字段,首先要把鼠標(biāo)移動(dòng)到輸入框


Then(/^模擬快捷鍵ctrl\+b$/, async function () {

    let div=await driver.findElement({css:'.CodeMirror-scroll'})//定位到輸入框
    await driver.actions().mouseMove(div).click()//鼠標(biāo)移動(dòng)到輸入框點(diǎn)擊
});

點(diǎn)擊之后你會(huì)看到檢查元素界面有兩個(gè)blingbling在跳動(dòng)的地方,其實(shí)這是光標(biāo)在閃爍,找到其中一個(gè)元素值就可以

let input_area=await driver.findElement({css:'.CodeMirror-cursor'})

定位到以后到了快捷鍵操作步驟了,記得之前曾經(jīng)介紹過的KEY嗎,它又可以表演了

最后我們的代碼是

Then(/^模擬快捷鍵ctrl\+b$/, async function () {

    let div=await driver.findElement({css:'.CodeMirror-scroll'})//定位到輸入框
    await driver.actions().mouseMove(div).click()//鼠標(biāo)移動(dòng)到輸入框點(diǎn)擊 
    await driver.actions().mouseMove(div).keyDown(Key.CONTROL).sendKeys('b').keyUp(Key.CONTROL).perform()
    //鼠標(biāo)移動(dòng)到輸入框,keyDown(Key.CONTROL)是按下ctrl鍵,同時(shí)sendKeys('b'),就是ctrl+b,
    //之后keyUp(Key.CONTROL)松開ctrl
});

運(yùn)行結(jié)果:在輸入框輸入了字體加粗操作,這里的****是markdown語法的粗體


今天的筆記為大家整理到這里,更多精彩課程,歡迎收看騰訊課堂
Node.js結(jié)合Selenium做web自動(dòng)化測(cè)試https://ke.qq.com/course/281565#tuin=173f40be
測(cè)試工具CukeTest下載地址http://www.cuketest.com/
晚上8:00,不見不散

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容