iframe切換

有時候在跑selenium腳本定位元素時,會遇到元素定位不到的情況,以126郵箱登錄界面爲例。

腳本如下:

# coding:utf-8
from selenium import webdriver
from time import sleep

driver = webdriver.Chrome()
driver.get("http://www.126.com")
print('Before login==============')

# 打印當前頁面的title
print(driver.title)

# 打印當前頁面URL
print(driver.current_url)

# driver.switch_to.frame('')
# 執行郵箱登錄
driver.find_element_by_name('email').send_keys("ps111")
腳本中報錯如下
Traceback (most recent call last):
  File "D:/AutomatedTesting/AutoWeb/ztest/126.py", line 17, in <module>
    driver.find_element_by_name('email').send_keys("ps1102366")
  File "C:\Python37\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 496, in find_element_by_name
    return self.find_element(by=By.NAME, value=name)
  File "C:\Python37\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 978, in find_element
    'value': value})['value']
  File "C:\Python37\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 321, in execute
    self.error_handler.check_response(response)
  File "C:\Python37\lib\site-packages\selenium\webdriver\remote\errorhandler.py", line 242, in check_response
    raise exception_class(message, screen, stacktrace)
selenium.common.exceptions.NoSuchElementException: Message: no such element: Unable to locate element: {"method":"name","selector":"email"}
  (Session info: chrome=73.0.3683.86)
  (Driver info: chromedriver=73.0.3683.68 (47787ec04b6e38e22703e856e101e840b65afe72),platform=Windows NT 10.0.17134 x86_64)

但是在瀏覽器的console中又可以定位到,

那麼此時就需要檢查是否有iframe了,

小技巧:在拿到網站的時候,打開瀏覽器按F12,在Elements中按ctrl+f,先搜一下frame,沒有搜到的話就不用切換

 

1.切換frame,frame後面可以是id,name,index或者selenium定位方法

# 126郵箱的name值爲空,所有frame後面跟個''
driver.switch_to.frame('')
# 如果name='frame'
driver.switch_to.frame('frame')
# id後面帶了時間戳,不可取
# driver.switch_to.frame('x-URS-iframe1557110432158.9517')
# 如果id爲固定值,比如id='iframe1'
driver.switch_to.frame('iframe1')
# 如果有好幾個iframe,則可以用index
driver.switch_to.frame(0)
# selenium元素定位方法切換iframe
driver.switch_to.frame(driver.find_element_by_css_selector('[frameborder="0"]'))

2.主文檔和父文檔切換

driver.switch_to.default_content()  # 進入frame後,需要操作主文檔的元素,則切換回主文檔
driver.switch_to.parent_frame()  # 切換到父文檔,如果已經是最頂層,則無變化

 

 

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章