Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/356.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Selenium webdriver python通过xpath查找元素-找不到元素_Python_Selenium_Selenium Webdriver - Fatal编程技术网

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

Selenium webdriver python通过xpath查找元素-找不到元素,python,selenium,selenium-webdriver,Python,Selenium,Selenium Webdriver,我试图用SeleniumWebDriverPython编写一个脚本。 当我试着做一个 find_element_by_xpath("//*[@id='posted_1']/div[3]") 上面说 NoElementFoundException 有人能帮我吗 问候 Bala不出意料,这个异常意味着该元素在DOM上不可用。这里有几个选项: driver.implicitly_wait(10) 将告诉驱动程序在找不到元素/不可单击等后等待10秒(或任意时间),然后重试。有时元素不会立即加载,因

我试图用SeleniumWebDriverPython编写一个脚本。 当我试着做一个

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

NoElementFoundException

有人能帮我吗

问候
Bala

不出意料,这个异常意味着该元素在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]")))

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

如果您得到的异常是
NoTouchElementException
,可能有以下原因:-

  • 可能是您使用的定位器不正确,所以您需要共享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]")))
    
    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();
    
  • 此元素可能位于任何
    iframe
    内。如果是,您需要在查找元素之前切换该
    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
    
    wait = WebDriverWait(driver, 10)
    
    element = wait.until(EC.visibility_of_element_located((By.XPATH, "//*[@id='posted_1']/div[3]")))
    
    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();
    

谢谢Saurabh,但在实施您的建议后,我在输出中看到了这一点。0.00s[INFO]开始测量[160824\u FW\u 3QJW]0.36s[INFO]执行WebDriver脚本20.76s[ERROR]TimeoutException:Traceback(最近一次调用):第34行,在element=wait.until(EC.visibility\u元素位于((By.XPATH,“/*[@id='posted\u 1']]/div[3]”)第80行,在until raise TimeoutException(消息、屏幕、堆栈跟踪)中)如果您的xpath是正确的,那么请确保此元素不在任何帧或iframe中。。。如果它是第三点……):嗨,Saurbah,是的,我检查了XPath。为了安全起见-尝试按名称查找同一属性的元素,但仍然得到相同的错误。这是实际的元素。这是我在剧本里写的。wait=driver.implicitly_wait(10)element=wait.until(位于((By.NAME,“searchBox”))的_element的EC.visibility_)这是我得到的输出。0.00s[INFO]开始测量[160825_5F_11V]0.38s[INFO]执行WebDriver脚本11.32s[ERROR]AttributeError:“非类型”对象没有属性“直到”回溯(最后一次调用):第34行,在元素中=等待。直到(元素的可见性位于((By.NAME,“searchBox”))我们需要您提供更多信息。例如,网站是什么?