假设我正在尝试查找名为element0
的元素,
driver.FindElement(element0).Click;
Thread.Sleep(5000);
根据我的WiFi速度,element0
可能需要花费5000到10000毫秒的时间才能显示出来。
不断更改Thread.Sleep()
中的值会破坏自动化的目的。
围绕try catch块进行操作可能会起作用:
try
{
driver.FindElement(element0).Click;
Thread.Sleep(5000);
}
catch(org.openqa.selenium.NoSuchElementException e)
{
driver.FindElement(element0).Click;
Thread.Sleep(5000);
}
但是如果在捕获element0
之后仍然不存在org.openqa.selenium.NoSuchElementException e
,那么它将抛出另一个相同的错误。
有没有更好的方法让我的代码进入睡眠状态?
我可以循环遍历driver.FindElement(element0).Click
直到出现element0
吗?
答案 0 :(得分:1)
硒气体显式等待该目的
import org.openqa.selenium.support.ui.ExpectedConditions;
import org.openqa.selenium.support.ui.WebDriverWait;
WebDriverWait wait = new WebDriverWait(WebDriverRefrence, 10);
WebElement element = wait.until(ExpectedConditions.visibilityOfElementLocated(element0));
element.click();
这将等待 up 10秒钟,以使该元素可见。您还有更多ExpectedConditions可以选择。
答案 1 :(得分:0)
由于findElemen将使用定义的超时,因此在findElement之后使用睡眠也将导致无意义的暂停 https://www.selenium.dev/selenium/docs/api/java/org/openqa/selenium/WebDriver.Timeouts.html
您可以隐式增加等待元素的超时时间。
CUDA
答案 2 :(得分:0)
使用Thread.Sleep()
暂停执行会导致当前正在执行的线程在指定的时间段内暂停执行。这是使处理器时间可用于应用程序的其他线程或可能在同一系统上运行的其他应用程序的有效方法。但是,由于它们受基础os提供的设施的限制,因此无法保证这些睡眠时间的准确性。睡眠时间也可以通过中断终止。最重要的是,您不能假定调用sleep将在指定的时间段内精确地挂起线程。
使用Selenium时,可以将sleep替换为implicitlyWait。通过引发implicitlyWait, driver 实例将轮询DOM Tree,直到找到该元素已配置的时间,然后在抛出{{3 }}。
示例:
Python :
driver.implicitly_wait(10)
Java :
driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
DotNet :
driver.Manage().Timeouts().ImplicitWait = TimeSpan.FromSeconds(10);
但是,更好的方法是将{strong> sleep 替换为NoSuchElementException,该配置将驱动程序实例配置为等待特定条件得到满足,然后再继续执行下一行代码。 / p>
示例:
Python :
WebDriverWait(driver, 20).until(EC.presence_of_element_located((By.CSS_SELECTOR, "element_css")))
Java :
new WebDriverWait(driver, 20).until(ExpectedConditions.visibilityOfElementLocated(By.cssSelector("element_css")));
DotNet :
new WebDriverWait(driver, TimeSpan.FromSeconds(10)).Until(ExpectedConditions.ElementIsVisible(By.CssSelector("element_css")))