硒:等待元素加载

时间:2020-06-10 18:34:37

标签: python html selenium

我还是Selenium的新手,很抱歉提出愚蠢的问题。我一直在尝试寻找一种方法来让硒等待元素被加载。元素位于弹出式<div>中,我需要滚动到底部以无限加载弹出式窗口{ {1}}。在Selenium的文档中,他们说要像这样使用<div>

WebdriverWait

while i <= 1000: try: #The xpath for the element I am trying to scroll to xpath = '/html/body/div[16]/div/div[1]/div/div[2]/div/div[1]/ul/li[' + str(i) +']' #Selenium's way of waiting for the presence of an element element = WebDriverWait(driver, 10).until(EC.presence_of_element_located(By.XPATH, xpath)) #Scrolling to that element driver.execute_script("arguments[0].scrollIntoView(true);", element) i += 10 except: print('Failed', i) time.sleep(2) 似乎不起作用。如果我只是向下滚动并使用WebdriverWait等待元素加载。有用。但是,我尝试加载的页面没有延迟加载已加载的内容。因此,html将所有已加载的元素存储在弹出式time.sleep(2)中,并且在div更新后向下滚动会很不错。 div越大,下一次加载所需的时间就越长。我想我正在寻找一个动态的Selenium等待(如果存在)。

2 个答案:

答案 0 :(得分:1)

您可以参考硒中的隐式等待。 隐式等待将指示Web驱动程序在引发“无此元素异常”之前等待一定的时间。 (隐式等待时间应用于会话脚本中的所有元素)

您可以像下面这样实现它:-

driver.manage().timeouts().implicitlyWait(10,TimeUnit.SECONDS) ;

这意味着,如果该元素不在该时间段(10秒)内位于网页上,则会引发异常。

  1. 硒中的其他等待是显式等待。 显式等待用于告诉Web驱动程序在引发“ ElementNotVisibleException”异常之前等待某些条件(Expected Conditions)或超过最大时间。

您可以像下面那样实现

WebDriverWait wait=new WebDriverWait(driver, 20);

wait.until(ExpectedConditions.visibilityOfElementLocated(By.xpath("//div[contains(text(),'STACKOVERFLOW')]")));

根据您的情况,它与警报有关,请尝试使用`

 wait.until(ExpectedConditions.alertIsPresent());
  1. 流连忘返等待硒的最后一次帮助

它定义了WebDriver在引发“ ElementNotVisibleException”之前检查条件是否出现的频率。

简而言之,Fluent Wait会定期(由您定义)重复查找一个web元素,直到发生超时或找到该对象为止。

当您尝试测试x秒/分钟后可能出现的元素时,应该使用它。

要实现流畅的等待,请尝试以下示例代码:-

 Wait<WebDriver> wait = new FluentWait<WebDriver>(driver)
.withTimeout(20, SECONDS)
.pollingEvery(5, SECONDS)
.ignoring(NoSuchElementException.class);

WebElement foo = wait.until(new Function<WebDriver, WebElement>() 
{
    public WebElement apply(WebDriver driver) {
    return driver.findElement(By.id("STACK011"));
}
});

答案 1 :(得分:0)

我实际上刚刚解决了它。我在excepted_conditions类中浏览其他方法,发现visibility_of_element_located。快速搜索堆栈,我发现了这个link。当将参数传递给expected_conditions类时,它期望一个元组,而不是2个参数。使用WebdriverWait的正确方法是这样的:

element = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH, xpath)))

那些该死的括号可以让你得到。