python之selenium調用js(execute_script)


原文鏈接: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()


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM