有时候在跑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() # 切换到父文档,如果已经是最顶层,则无变化