• selenium.common.exceptions.NoSuchElementException: Message: no such element: Unable to locate element 定位frame中的元素


    from selenium import webdriver
    import time
    
    def sleep(w=1):
        time.sleep(w)
        return 0
    
    # 初始化浏览器信息
    driver = webdriver.Chrome()
    driver.get("http://m.mail.10086.cn")
    
    print("------------------------------login in-------------------------------")
    title = driver.title
    now_url = driver.current_url
    print(title)
    print(now_url)
    sleep()
    
    driver.find_element_by_name("UserName").clear()
    driver.find_element_by_name("UserName").send_keys("userName")
    sleep()
    driver.find_element_by_css_selector(".textBox_pw").clear()
    driver.find_element_by_css_selector(".textBox_pw").send_keys("passWord")
    sleep()
    driver.find_element_by_id("loginBtn").click()
    
    print("-----------------------------finish login-----------------------------")
    
    title = driver.title
    now_url = driver.current_url
    print(title)
    print(now_url)
    sleep()
    
    userName = driver.find_element_by_id("userName").text
    print(userName)
    
    driver.quit()
    

     上面是初始时完成的代码,最终的目的是获取到当前登录人的昵称。

    上图为在firefox浏览器中获取到的元素信息,按照以往的经验,最上面的代码应该是一次通过的,但是执行的时候出现了如下的错误:

    翻看网络上的资料,了解到定位元素仅会在当前所处的frame中寻找该元素,如果有多个frame时需要先切换到对应的frame下才能够找到该元素。重新查看需要定位的页面信息发现果真要寻找的元素在一个名为‘ifbg’的iframe下,如下图所示:

    所以如果想要代码能够正常执行需要先切换到元素所在的frame下,切换frame使用的语句为:driver.switch_to_frame(***)

    此处需要分为两种情况进行操作:

    情况1. 需要切换至的frame有id或name标记,则可以直接使用切换语句,如

    driver.switch_to_frame('ifbg') #括号内填入iframe的id或name标记值均可

     情况2.frame没有id或name标记,但有class标记,需要先获取到对应的frame,然后在切换至该frame

    frame1 = driver.find_element_by_css_selector(".main-iframe")
    driver.switch_to_frame(frame1)

    frame1 = driver.find_element_by_css_selector(".main-iframe")
    driver.switch_to_frame(frame1)
    userName = driver.find_element_by_id("userName").text
    print(userName)
    

     最终完成的该部分代码如上所示,此时改元素定位不到的问题得到解决。

  • 相关阅读:
    leetcode236
    leetcode139
    leetcode56
    leetcode19
    2018-5-22-SublimeText-粘贴图片保存到本地
    2019-1-29-Sublime-Text-安装中文、英文字体
    2019-1-29-Sublime-Text-安装中文、英文字体
    2018-8-15-WPF-插拔触摸设备触摸失效
    2018-8-15-WPF-插拔触摸设备触摸失效
    2019-10-18-dotnet-修复找不到-System.ServiceProcess-定义
  • 原文地址:https://www.cnblogs.com/liyuhang/p/6661835.html
Copyright © 2020-2023  润新知