關(guān)鍵詞:selenium王滤、python碰逸、Chrome
測(cè)試需求:郵箱登錄后削祈,發(fā)送測(cè)試郵件
一饰抒、登錄
Chrome F12定位后肮砾,發(fā)現(xiàn)賬號(hào)輸入框是有id屬性,這是我們最希望看到的袋坑。
登錄按鈕元素定位如下:
登錄按鈕,如果通過(guò)CSS選擇器定位 .w-button,發(fā)現(xiàn)有2個(gè)。
如果切換到第二個(gè)定位到的元素發(fā)現(xiàn)疆柔,2個(gè)元素的屬性很像咒精。差別就在:一個(gè)元素class是w-button-account,一個(gè)元素class是w-button-admin旷档。
<button class="w-button w-button-account js-loginbtn" type="submit" tabindex="4">登 錄</button>
<button class="w-button w-button-admin js-loginbtn" type="submit" tabindex="4">管理員登錄</button>
所以最終我們決定使用.w-button-account去定位模叙。
登錄的代碼如下:(敏感詞使用xxxxx表示)
#login
driver.find_element_by_id("accname").send_keys('xxxxxxxxxx')
driver.find_element_by_id("accpwd").send_keys('xxxxxx')
driver.find_element_by_css_selector(".w-button-account").click()
二、點(diǎn)擊寫信按鈕
登錄成功后鞋屈,需要點(diǎn)擊寫信范咨。
元素定位發(fā)現(xiàn)a標(biāo)簽有一個(gè)aXieXIN class屬性,也是可以唯一定位的。
但是注意下厂庇,前面有個(gè)html標(biāo)簽渠啊,需要考慮frame的存在。關(guān)于frame的理解參考selenium frame講解和案例
切換過(guò)去后权旷,的確有一個(gè)frame替蛉。
代碼如下:
time.sleep(2) #登錄有的時(shí)候頁(yè)面加載會(huì)慢,加個(gè)延遲處理
driver.switch_to.frame("folder")
driver.find_element_by_css_selector(".aXieXIN").click()
三拄氯、編輯內(nèi)容-收件人
點(diǎn)擊寫信按鈕之后躲查,跳轉(zhuǎn)到編輯界面。
元素定位后译柏,發(fā)現(xiàn)收件人有id屬性oDivTo,也有frame的處理镣煮。
代碼如下:
driver.switch_to.default_content()
driver.switch_to.frame("foldmain")
time.sleep(2)
driver.find_element_by_css_selector("#oDivTo").send_keys("xxxxxxxxxx"+'\n')
但是執(zhí)行過(guò)程中,報(bào)錯(cuò)connot focus element鄙麦。而且在收件人輸入框典唇,根本沒(méi)有光標(biāo)閃爍,怪不得獲得不到焦點(diǎn)呢胯府。沒(méi)有焦點(diǎn)蚓聘,無(wú)法輸入。
本以為元素需要click盟劫,再輸入夜牡。但是加大延遲后,發(fā)現(xiàn)一開始光標(biāo)是閃爍的侣签,但是執(zhí)行send_keys時(shí)就報(bào)錯(cuò)塘装。
經(jīng)過(guò)多番排查,終于知道原因影所。我們回顧下我們之前定位的元素蹦肴,收件人的元素我們定位的是div標(biāo)簽,但是div標(biāo)簽是不能夠輸入的猴娩,input和body這些元素才可以輸入阴幌。
有兩種解決方案:
方案一:找到div下面的input標(biāo)簽勺阐,send_keys
代碼如下:
#編輯內(nèi)容
#收件人
time.sleep(2)
driver.switch_to.default_content()
driver.switch_to.frame("foldmain")
driver.find_element_by_css_selector("#oDivTo input").send_keys("xxxxxxxxxxx"+'\n')
方案二:使用ActionChains動(dòng)作鏈,這個(gè)類常用于一些鍵鼠操作矛双。代碼如下:
time.sleep(2)
driver.switch_to.default_content()
driver.switch_to.frame("foldmain")
from selenium.webdriver.common.action_chains import ActionChains
ac=ActionChains(driver)
receiver=driver.find_element_by_id("oDivTo")
ac.click(receiver).send_keys("xxxxxxxxxx"+'\n').perform()
四渊抽、編輯內(nèi)容-主題
主題元素通過(guò)id屬性定位,主題元素也是在foldmain這個(gè)frame里面议忽,不需要切換:
代碼如下:
driver.find_element_by_id("subject").send_keys("test")
五懒闷、編輯內(nèi)容-內(nèi)容
內(nèi)容定位到body元素,前面有一個(gè)HtmlEditor frame栈幸。再往前切換還有一個(gè)editor frame愤估。再往前切換還有foldmain frame。
目前為止速址,我們使用過(guò)的frame的架構(gòu)圖如下:
六玩焰、發(fā)送
發(fā)送直接通過(guò)id屬性定位,但是發(fā)送按鈕在foldmain 這個(gè)frame下面:
代碼如下:
#發(fā)送
driver.switch_to.default_content()
driver.switch_to.frame("foldmain")
driver.find_element_by_id("oSendButton1").click()
------------------------------------------------------------------------------------------最終代碼如下:
from selenium import webdriver
import time
driver=webdriver.Chrome('d:\webdriver\chromedriver.exe')
driver.implicitly_wait(10)
driver.get("https://qiye.163.com/login/")
#login
driver.find_element_by_id("accname").send_keys('xxxxxxxx')
driver.find_element_by_id("accpwd").send_keys('xxxxxxxx')
driver.find_element_by_css_selector(".w-button-account").click()
#點(diǎn)擊寫信
time.sleep(2) #登錄有的時(shí)候頁(yè)面加載會(huì)慢,加個(gè)延遲處理
driver.switch_to.frame("folder")
driver.find_element_by_css_selector(".aXieXIN").click()
#方法一
#編輯內(nèi)容
#收件人
# time.sleep(2)
# driver.switch_to.default_content()
# driver.switch_to.frame("foldmain")
# driver.find_element_by_css_selector("#oDivTo input").send_keys("xxxxxxxxxxxx"+'\n')
#方法二
time.sleep(2)
driver.switch_to.default_content()
driver.switch_to.frame("foldmain")
from selenium.webdriver.common.action_chains import ActionChains
ac=ActionChains(driver)
receiver=driver.find_element_by_id("oDivTo")
ac.click(receiver).send_keys("xxxxxxxxxxx"+'\n').perform()
#主題
driver.find_element_by_id("subject").send_keys("test")
#內(nèi)容
driver.switch_to.frame("editor")
driver.switch_to.frame("HtmlEditor")
driver.find_element_by_tag_name("body").send_keys("test")
#發(fā)送
driver.switch_to.default_content()
driver.switch_to.frame("foldmain")
driver.find_element_by_id("oSendButton1").click()
input()
driver.quit()