我还是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等待(如果存在)。
答案 0 :(得分:1)
您可以参考硒中的隐式等待。 隐式等待将指示Web驱动程序在引发“无此元素异常”之前等待一定的时间。 (隐式等待时间应用于会话脚本中的所有元素)
您可以像下面这样实现它:-
driver.manage().timeouts().implicitlyWait(10,TimeUnit.SECONDS) ;
这意味着,如果该元素不在该时间段(10秒)内位于网页上,则会引发异常。
您可以像下面那样实现
WebDriverWait wait=new WebDriverWait(driver, 20);
wait.until(ExpectedConditions.visibilityOfElementLocated(By.xpath("//div[contains(text(),'STACKOVERFLOW')]")));
根据您的情况,它与警报有关,请尝试使用`
wait.until(ExpectedConditions.alertIsPresent());
它定义了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)))
那些该死的括号可以让你得到。