为什么我不能两个接一个地等待?

时间:2019-10-25 16:42:16

标签: javascript c# selenium-webdriver

好,所以我尝试单击xpath正确的复选框,因为我已经使用Clickable.Click()在WebDriverWait中尝试了它。等等,但是只有当我向下滚动页面并且它可见时,它才起作用。我已经找到了用javascript和一些硒编写的scrollviewandclick代码。因此,基本上,如果我想滚动并单击视线之外的任何内容,我只需使用

objCommon.ScrollInToViewAndClick(driver.FindElement(By.Xpath("YOUR Locator")));

正如我之前所说的,如果使用以下代码将鼠标移至页面下方的复选框,它会单击:

WebDriverWait wait = new WebDriverWait(driver, TimeSpan.FromSeconds(10));
wait.Until(SeleniumExtras.WaitHelpers.ExpectedConditions.ElementToBeClickable(driver.FindElement(By.Xpath("YOUR Locator"))).Click();

但是我希望更改我的javascript / Selenium scrollviewandclick方法以合并此单击,但是这不会让我等待2次。有人可以建议我要去哪里了吗。

下面的scrollviewandclick方法:

public void ScrollInToViewAndClick(IWebElement element)
        {
            IJavaScriptExecutor executor = (IJavaScriptExecutor)driver;
            executor.ExecuteScript("arguments[0].scrollIntoView(true);", element);

            WebDriverWait wait = new WebDriverWait(driver, TimeSpan.FromSeconds(20));
            var elementList = new List<IWebElement>
            {
                element
            };

            var readonlyCollection = new ReadOnlyCollection<IWebElement>(elementList);
            wait.Until(SeleniumExtras.WaitHelpers.ExpectedConditions.VisibilityOfAllElementsLocatedBy(readonlyCollection));
            wait.Until(SeleniumExtras.WaitHelpers.ExpectedConditions.ElementToBeClickable(element)).Click();

        }

2 个答案:

答案 0 :(得分:1)

您正在调用Wait.Until()上的.Click() 在最糟糕的第二次等待之后,您应该使用element.Click()。

答案 1 :(得分:-1)

您可以连续两次等待而不会出现问题,我不确定您遇到什么错误。看到您似乎对Selenium感到陌生,让我解释一些事情并提出一些建议:

  1. 您出于某种原因将一个WebElement转换为一个集合?想必您可以使用VisibilityOfAllElementsLocatedBy()吗?您无需执行此操作,因为此等待方法有一个单一版本ElementIsVisible()

  2. 您无需等待元素可见然后单击即可。为了使元素可单击,必须使其可见,因此只需单击即可。

  3. 如果您尝试滚动到一个可见的元素,则会收到错误消息。因此,请等待该元素可单击(可见),滚动到该元素,然后单击它。

牢记这三件事,我将您的代码重写到下面。

public void ScrollInToViewAndClick(IWebElement element)
{
    new WebDriverWait(driver, TimeSpan.FromSeconds(20)).Until(SeleniumExtras.WaitHelpers.ExpectedConditions.ElementToBeClickable(element));
    ((IJavaScriptExecutor)driver).ExecuteScript("arguments[0].scrollIntoView(true);", element);
    element.Click();
}