原文鏈接:https://blog.csdn.net/yinlin330/article/details/82625454
在編寫自動化程序的時候,會遇到彈出新窗口的情況,而程序總是默認在第一個窗口頁定位元素,這樣,就會定位不到元素,程序報錯。
舉一個實例說明,如下的網站在第一窗口頁面點擊“登陸”,會彈出一個新的窗口頁輸入用戶名/密碼,如果程序不做出來,在定位用戶名的時候,程序會在第一個窗口頁中查詢,所以會報錯
要解決這個問題有兩種方法:
首先,弄明白為什么點擊“登錄”按鈕會彈出一個新的窗口,下面我們來檢查一下“登錄”按鈕的代碼:
我們可以看到,這是一個HTML a 標簽,a標簽的 target 屬性規定在何處打開鏈接文檔。這里的target屬性定義了瀏覽器將打開一個新的窗口
如果,不想彈出一個新窗口,就需要先刪除target屬性
怎么刪除target?
1、第一種方法
通過執行JavaScript中的代碼刪除target
代碼如下:
document.getElementsByClassName("site-nav-right fr")[0].childNodes[1].removeAttribute("target")
①注:在JavaScript的console中回車執行
②childNodes[1],表示元素節點位置
③removeAttribute(“target”),表示刪除元素
完整代碼:
from selenium import webdriver
driver=webdriver.Chrome()
driver.implicitly_wait(3)
driver.get("http://localhost/")
js = 'document.getElementsByClassName("site-nav-right fr")[0].childNodes[1].removeAttribute("target")'
driver.execute_script(js) #調用js方法,同時執行javascript腳本
driver.find_element_by_link_text('登錄').click()
driver.find_element_by_id("username").send_keys("yonghuming")
2、第二種方法
JavaScript比較復雜,我們可不可以通過selenium定位元素來執行JavaScript的腳本,可以的
①通過selenium定位元素登錄鏈接
login_link = driver.find_element_by_link_text(‘登錄’)
②把login_link元素傳入JavaScript語句,代替
document.getElementsByClassName(“site-nav-right fr”)[0].childNodes[1],而arguments[0]可以幫我們把selenium的元素傳入到JavaScript語句中
arguments指的是execute_script()方法中js代碼后面的所有參數,arguments[0]表示第一個參數,argument[1]表示第二個參數
js=’arguments[0].removeAttribute(argument[1])’
driver.execute_script(js,login_link,”target”)
③點擊登陸鏈接
login_link.click()
完整代碼:
from selenium import webdriver
driver=webdriver.Chrome()
driver.implicitly_wait(3)
driver.get("http://localhost/")
login_link = driver.find_element_by_link_text('登錄')
js='arguments[0].removeAttribute(argument[1])'
driver.execute_script(js,login_link,"target")
login_link.click()