2016-08-24 258 views

回答

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]"))) 

以我的经验,一个隐含的等待通常是罚款,但不精确。

0

如果你正在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(); 
    
+0

谢谢Saurabh,但在实施你的建议后,这是我在输出中看到的。 0.00S [INFO]开始测量[160824_FW_3QJW] 0.36s [INFO]执行脚本的webdriver 20.76s [ERROR] TimeoutException异常: 回溯(最近最后调用):34 线,在<合成脚本> \t元素=等待.until(EC.visibility_of_element_located((By.XPATH,“// * [@ id ='posted_1']/div [3]”))) 第80行,直到 \t raise TimeoutException(message,screen,stacktrace) –

+0

确保首先你的xpath是正确的... –

+0

如果你的xpath是正确的,那么确保这个元素不在任何框架或iframe中...如果它然后考虑第三个提供的点... :) –

相关问题