Selenium webdriver python通过xpath查找元素 - 无法找到元素

时间:2016-08-24 23:21:58

标签: python selenium selenium-webdriver

我正在尝试使用selenium webdriver python编写脚本。 当我尝试做一个

find_element_by_xpath("//*[@id='posted_1']/div[3]") 

它说

  

NoElementFoundException。

有人可以帮我吗?

此致 巴拉

2 个答案:

答案 0 :(得分:1)

如果您获得NoSuchElementException作为提供的例外情况,可能有以下原因: -

  • 可能是您找到了错误的定位器,因此您需要共享HTML以获得更好的定位器解决方案。

  • 可能是在你要找到元素的时候,它不会出现在DOM上,所以你应该实现WebDriverWait等待元素可见,如下所示: -

    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
    
    wait = WebDriverWait(driver, 10)
    
    element = wait.until(EC.visibility_of_element_located((By.XPATH, "//*[@id='posted_1']/div[3]")))
    
  • 此元素可能位于任何frameiframe内。如果是,您需要在找到以下元素之前切换frameiframe: -

    driver.switch_to_frame("frame/iframe I'd or name")
    
    wait = WebDriverWait(driver, 10)
    
    element = wait.until(EC.visibility_of_element_located((By.XPATH, "//*[@id='posted_1']/div[3]")))
    
    #Once all your stuff done with this frame need to switch back to default
    driver.switch_to_default_content();
    

答案 1 :(得分:0)

不出所料,该异常意味着该元素在DOM上不可用。这里有几个选项:

driver.implicitly_wait(10)

将告诉驱动程序在找不到元素/不可点击等之后等待10秒(或任何时间),然后再尝试。有时元素不会立即加载,因此隐式等待会修复这些类型的问题。

这里的另一个选择是做一个明确的等待。这将等到元素出现,直到确认该元素的存在,脚本将不会移动到下一行:

from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait 
from selenium.webdriver.support import expected_conditions as EC 

element = WebDriverWait(ff, 10).until(EC.presence_of_element_located((By.XPATH, "//*[@id='posted_1']/div[3]")))

根据我的经验,隐性等待通常很好,但不精确。