这里对python提出了同样的问题:Selenium—等待元素出现、可见且可交互。然而,答案并没有涵盖所有的情况。
当我不处于调试模式时,我的实现有时会失败。我认为等待ID是一个非常琐碎的任务,应该有一个直接的吻实现,并且永远不会失败。
public IWebElement WaitForId(string inputId, bool waitToInteract = false, int index = 0)
{
IWebElement uiElement = null;
while (uiElement == null)
{
var items = WebDriver.FindElements(By.Id(inputId));
var iteration = 0;
while (items == null || items.Count < (index + 1) ||
(waitToInteract && (!items[index].Enabled || !items[index].Displayed)))
{
Thread.Sleep(500);
items = WebDriver.FindElements(By.Id(inputId));
if (items.Count == 0 && iteration == 10)
{
// "still waiting...: " + inputId
}
if (iteration == 50)
{
// "WaitForId not found: " + inputId
Debugger.Break(); // if tried too many times, maybe you want to investigate way
}
iteration++;
}
uiElement = WebDriver.FindElement(By.Id(inputId));
}
return uiElement;
}
public IWebElement GetActiveElement(string id, int allowedTimeout = 20, int retryInterval = 250)
{
var wait = new DefaultWait<IWebDriver>(_driver)
{
Timeout = TimeSpan.FromSeconds(allowedTimeout),
PollingInterval = TimeSpan.FromMilliseconds(retryInterval)
};
return wait.Until(d =>
{
var element = d.FindElement(By.Id(id));
return element.Displayed || element.Enabled ? element : throw new NoSuchElementException();
});
// Usage would be something like this
GetActiveElement("foo").SendKeys("Bar");
您应该能够创建扩展方法并调用扩展
public static class WebDriverExtension
{
public static IWebElement GetActiveElement(this IWebDriver driver, string id, int allowedTimeout = 20, int retryInterval = 250)
{
var wait = new DefaultWait<IWebDriver>(driver)
{
Timeout = TimeSpan.FromSeconds(allowedTimeout),
PollingInterval = TimeSpan.FromMilliseconds(retryInterval)
};
return wait.Until(d =>
{
var element = d.FindElement(By.Id(id));
return element.Displayed || element.Enabled ? element : throw new NoSuchElementException();
});
}
}
// usage
_driver.GetActiveElement("foo").SendKeys("bar");
我有一个Selenium脚本(Python),它单击一个回复按钮以显示类anonemail。类anonemail显示所需的时间各不相同。因此,在元素出现之前,我必须使用sleep。 我想等到类已经出现,而不是使用睡眠。我听说过等待命令,但我不知道如何使用它们。 这是我到目前为止所拥有的:
我正在尝试在使用VueJs的单页应用程序中开发一个自动化测试,当我单击注册按钮时,页面加载了一个包含元素的表单,但是由于元素根据需要加载,它们不会自动出现在那里,我可以解决在单击注册按钮后放置driver.sleep的问题,但我正在寻找一种解决方法,我尝试了InluductEts和elisEnabled,但我无法得到结果,在这里检查我的代码: const { Builder, By, Key, 直
所以我们有一页医学专科。它原本只是英文的。因此,如果您搜索“neuro”,则HTML看起来类似于 然后他们添加了西班牙语,所以并不是所有的结果都会返回,但是只有西班牙语是可见的。一个新的 > 添加在底部。 是否有方法等待任何匹配xpath的元素可见?注意,visibilityOfAllElements()将不起作用,因为它们不会全部可见。 我想可以做的是,预先计算所有带有@id和“width”的元
我是新的Selenium C#NUnit。我跟着一行代码跑了 var wait=new WebDriverWait(驱动程序,TimeSpan.FromSeconds(30));等待直至(d)= 我得到了以下消息:消息:OpenQA. Selenium。元素不可交互(会话信息:chrome=89.0.4389.114)堆栈跟踪:远程WebDriver。Unpack AndThrowOnError(
我试图得到某个产品的评论,但它返回一个错误。 我的代码: 它返回:硒。常见的例外。ElementNotInteractitableException:消息:元素不可交互 你能告诉我该怎么办吗?
我正试图对这个网站进行测试。(https://www.phptravels.net/),我想测试一下它的登录特性。有一个“我的帐号”链接,需要先点击,显示登录和注册按钮的下拉。HTML代码如下所示: 当我尝试单击“我的帐户”按钮时,它抛出一个错误消息,说“元素不可见”。我很困惑,因为显然这个按钮一直可见。代码如下: 我的代码有什么问题?谢谢你。