【问题标题】:C# + Selenium: automation waitC# + Selenium:自动化等待
【发布时间】:2018-08-28 02:50:54
【问题描述】:

下面的代码不起作用,它总是在第 2 行抛出 No such element 异常。

wait.IgnoreExceptionTypes(typeof(NoSuchElementException));      
wait.Until(ExpectedConditions.ElementToBeClickable(By.XPath(element)));

【问题讨论】:

  • 什么是元素?

标签: c# selenium wait explicit


【解决方案1】:

这里可能有两个问题:

  1. 你试图在它可见之前找到元素,你可以通过这样做等待元素

    wait.Until(ExpectedConditions.ElementExists(By.XPath(element)));
    

    其中 element 是您要查找的元素的 XPath。

  2. 您没有使用正确的 XPath 找到元素。如果您使用的是绝对 XPath,请避免这样做,因为虽然绝对 XPath 可以更快地找到元素,但如果 DOM 结构发生更改,您的路径可能不再有效。

【讨论】:

  • 1.我试过这个语句,但仍然是同样的问题,wait.Until(ExpectedConditions.ElementExists(By.XPath(element)));
  • 2.我相信我使用的是正确的 xpath,如果我使用 Thread.Sleep(TimeSpan.FromSeconds(4));它工作正常。
  • 错误消息“org.openqa.selenium.WebDriverException:元素在点 (411, 675) 处不可点击。其他元素将收到点击:...”
  • 所以这里的问题是你试图点击的元素上有一个覆盖。解决此问题的一种方法是使用 Action Ex 创建一个新的操作对象: Actions action = new Actions(webdriver);然后你做 action.MoveToElement(element).Click().Perform();当元素上有隐藏的叠加层时会发生此异常。
  • @vignesh 尝试等待重叠元素不可见。我发现这也倾向于在这种情况下工作
【解决方案2】:

也有可能您没有全屏运行浏览器,至少这是我在更改当前项目的 GUI 时面临的一个有效问题。在我的 ClassInitialize 中添加 driver.Manage().Window.Maximize(); 一时兴起解决了这个问题。

另一种选择是,您的元素可能嵌入到 iframe 中或被一个 iframe 重叠。

【讨论】:

    【解决方案3】:

    正如这个答案https://stackoverflow.com/a/44724688/6045154 中提到的,我已经解决了一个类似的问题:

    IWebElement button = driver.FindElement(By.ClassName("transfer__button")); IJavaScriptExecutor executor = (IJavaScriptExecutor)driver; executor.ExecuteScript("arguments[0].click();", button);

    当然,这需要编辑才能通过正确的选择器找到您的元素。

    【讨论】:

      猜你喜欢
      • 2018-08-09
      • 2020-04-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-12
      • 1970-01-01
      • 2021-09-01
      • 2018-11-30
      相关资源
      最近更新 更多