我遇到隐藏元素的问题。该网站已满载,因此每个项目都可用,无需加载,切换页面。 我尝试了ExpectedConditions的所有选项,但仍未等待元素。使用查找功能,我得到位置,但x,y坐标为:( - 125,156),因此无法单击它(在屏幕上也不可见) 非常糟糕的解决方法是使用+ Thread.Sleep(1000);和一个计数器......而x> 0和> 0 哪个我想避免..有什么想法吗? 代码示例:
ChromeOptions chromeCapabilities = new ChromeOptions();
chromeCapabilities.EnableMobileEmulation("iPhone 7");
IWebDriver webDriver = new ChromeDriver(chromeCapabilities);
webDriver.Manage().Window.Maximize();
webDriver.Navigate().GoToUrl("https://m.exmaple.org");
WebDriverWait driverWait = new WebDriverWait(webDriver, TimeSpan.FromSeconds(30.0));
IWebElement menu_1;
IWebElement switch_left;
switch_left = webDriver.FindElement(By.Id("item_1"));
switch_left.Click(); // ~3-5 sec while switched left because of animations
driverWait.Until(ExpectedConditions.ElementToBeClickable(By.Id("item_1"))));
menu_1 = webDriver.FindElement(By.Id("item_1"));
menu_1.Click(); System.InvalidOperationException: 'unknown error: Element is not clickable at point (-125, 156)
答案 0 :(得分:1)
如果我正确理解了您的问题,那么当您在浏览器框架之外时,您会尝试单击该元素。您需要一种方法来等待元素在单击后移动到框架中。没有内置的方法来执行此操作,因此您需要自定义等待。
您应该可以使用如下所示的内容。它基本上等到元素的X / Y坐标(技术上是左上角)在浏览器框架内。我认为这对你有用。
public IWebElement WaitForElementToBeOnscreen(By locator)
{
WebDriverWait wait = new WebDriverWait(Driver, TimeSpan.FromSeconds(10));
wait.Until<IWebElement>(d =>
{
IWebElement element = d.FindElement(locator);
if (element.Location.X > 0 &&
element.Location.X < Driver.Manage().Window.Size.Width &&
element.Location.Y > 0 &&
element.Location.Y < Driver.Manage().Window.Size.Height)
{
return element;
}
return null;
});
return null;
}
注意:为了使其更加准确,您可以考虑元素的大小。例如,确保X大于0且小于窗口宽度 - 元素的宽度......依此类推。
您可能遇到的另一个问题是,如果元素永远不会移动......它会停留在浏览器框架之外。如果发生这种情况,则等待将超时。我不确定在这种情况下你想做什么......你可以用try-catch
包裹它并返回null
或你决定做的其他事情。