刚开始入手学习selenium登陆126邮箱愣是运行不成功,总是提醒定位失败,不管是用id,还是classname,还是classpath等等,都是一样的效果。然后就百度。搜到了答案
使用id定位
Message: no such element: Unable to locate element: {"method":"id","selector":"auto-id-1537235284167"},找不到元素。原因是由于此id是动态id,每次刷新http://www.126.com页面该值都会变话。因此找不到对应元素。
使用类定位
原因是:该class是含有空格的复合类。无法直接使用find_element_by_class_name()方法查询。
还是提示找不到元素,原因是:由于定位元素仅会在当前所处的frame中寻找该元素,如果有多个frame时需要先切换到对应的frame下才能够找到该元素。仔细查看页面信息,找到到id为x-URS-iframe的iframe。
如果未加载完毕,依旧定位不到元素所在的frame。所以此时需要加一个延时操作,time.sleep()。使用time的时候需要import time模块。
然后就可以正常运行成功了
import time
driver = webdriver.Chrome()
driver.get("http://www.126.com")
time.sleep(2)
driver.switch_to.frame("x-URS-iframe")
# 定位到对应的frame
driver.find_element_by_css_selector(".dlemail").clear()
# 单个属性
driver.find_element_by_css_selector("[class='j-inputtext dlemail']").send_keys("user")
# 直接包含空格的CSS属性定位
driver.find_element_by_css_selector(".j-inputtext.dlpwd").clear()
# css定位双属性
driver.find_element_by_css_selector(".dlpwd").send_keys("pwd")
# css定位单属性
driver.find_element_by_css_selector(".loginbox").click()
如果没有id
1.需要先定位iframe,使用任何定位方法均可
2.这里就是用tagname定位了
iframe =driver.find_element_by_tag_name("iframe")
3.定位之后切换即可
driver.switch_to_frame(iframe)