【问题标题】:Selenium Python Script throws no element error exception even though the x path is right?即使 x 路径正确,Selenium Python 脚本也不会引发元素错误异常?
【发布时间】:2016-11-27 19:55:48
【问题描述】:
from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.keys import Keys
driver=webdriver.Chrome()
driver.get("https://paytm.com/")
driver.maximize_window()
driver.find_element_by_class_name("login").click()
driver.implicitly_wait(10)
driver.find_element_by_xpath("//md-input-container[@class='md-default-theme md-input-invalid']/input[@id='input_0']").send_keys("99991221212")

在上面的代码中,我使用 fire bug 验证了 xpath,它突出显示了正确的元素。但是当脚本运行失败时?大家能帮帮我吗?

【问题讨论】:

    标签: python python-2.7 selenium selenium-webdriver selenium-chromedriver


    【解决方案1】:

    在 selenium 中,每一帧都是单独处理的。由于登录位于单独的iframe 元素中,因此您需要先使用以下命令切换到它:

    iframe = driver.find_elements_by_tag_name('iframe')[0]
    driver.switch_to_frame(iframe) 
    

    尝试与其元素交互之前。

    或者在这种情况下,你会等待框架存在,它会是:

    from selenium import webdriver
    from selenium.webdriver.common.by import By
    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.support import expected_conditions as EC
    
    driver = webdriver.Chrome()
    driver.get("https://paytm.com/")
    driver.maximize_window()
    
    wait = WebDriverWait(driver, 10)
    
    wait.until(EC.visibility_of_element_located((By.CLASS_NAME, "login"))).click()
    wait.until(EC.frame_to_be_available_and_switch_to_it((By.TAG_NAME, "iframe")))
    
    _input = wait.until(EC.visibility_of_element_located((By.ID,"input_0")))
    _input.send_keys("99991221212")
    

    【讨论】:

      【解决方案2】:

      您应该尝试使用WebDriverWait 等到页面上显示input 元素,如下所示:-

      from selenium.webdriver.common.by import By
      from selenium.webdriver.support.ui import WebDriverWait
      from selenium.webdriver.support import expected_conditions as EC
      
      driver = webdriver.Chrome()
      driver.get("https://paytm.com/")
      driver.maximize_window()
      
      wait = WebDriverWait(driver, 10)
      
      wait.until(EC.visibility_of_element_located((By.CLASS_NAME, "login"))).click()
      
      #now switch to iframe first      
      wait.until(EC.frame_to_be_available_and_switch_to_it((By.TAG_NAME, "iframe")))
      
      input = wait.until(EC.visibility_of_element_located((By.ID, "input_0")))
      input.send_keys("99991221212")
      

      希望对您有所帮助...:)

      【讨论】:

      • @Subbu 你试过XPath 还是id??
      • @Subbu 因为我看到输入元素在iframe..你需要在找到输入元素之前切换该框架..查看更新的答案..
      猜你喜欢
      • 2011-10-04
      • 2020-07-20
      • 2018-04-01
      • 2018-05-03
      • 1970-01-01
      • 1970-01-01
      • 2016-05-28
      • 2020-11-02
      • 1970-01-01
      相关资源
      最近更新 更多