我有隐藏元素的问题。该网站已满载,因此每个项目都可用,无需加载,切换页面。我尝试了ExpectedConditions的所有选项,但仍未等待元素。使用Find函数我得到位置,但x,y坐标是:( - 125,156)因此无法单击它(在屏幕上也不可见)非常糟糕的解决方法是while + 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)
如果我正确理解您的问题,那么当您在浏览器框架之外时,您尝试单击该元素。您需要一种方法来等待元素在单击后移动到框架中。没有内置方法来执行此操作,因此您需要自定义等待。
你应该可以使用类似下面的东西。它基本上等到元素的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
或你决定的其他任何东西。