【问题标题】:Selenium / C# WebDriverWait Not WaitingSelenium / C# WebDriverWait 不等待
【发布时间】:2014-05-05 18:46:56
【问题描述】:

我有一个网站,顶部有一个 jQuery 滑块,上面列出了我要使用的所有语言:http://testing.bestshippers.com/net/index.aspx,滑块是顶部的“语言选择”按钮。

我可以单击它,但是在尝试单击向下幻灯片内的元素时出现错误。我相信这是因为在尝试选择它们之前我需要暂停几秒钟。可能是错的?我相对较新,但我已经阅读了有关 WebDriverWait 和改变焦点的各种内容。

 //check spanish
 driver.FindElement(By.XPath("//*[@id='openCloseWrap']/img")).Click();
 WebDriverWait wait = new WebDriverWait(driver, TimeSpan.FromSeconds(100));
 driver.FindElement(By.Id("ButtonSPFlag")).Click();

 String check = driver.FindElement(By.XPath("html/body/form/div[5]/div/div[1]/div/p")).Text;
 Console.Out.WriteLine(check);

上面的代码点击了openCloseWrap(语言选择按钮),然后我尝试暂停几秒钟(100)然后尝试点击SP标志来改变语言。

谁能提供任何帮助说明为什么我的等待不会暂停?

【问题讨论】:

    标签: c# selenium selenium-webdriver webdriver qa


    【解决方案1】:

    您正在启动等待,但没有等待任何内容。您可能想做类似的事情:

    WebDriverWait wait = new WebDriverWait(driver, TimeSpan.FromSeconds(100));
    //    wait.Until(By.Id("ButtonSPFlag"));
    IWebElement element = wait.Until(driver => driver.FindElement(By.Id("ButtonSPFlag")));
    element.Click();
    

    您也可以设置隐式等待,但我会选择第一个。

    driver.Manage().Timeouts().ImplicitlyWait(TimeSpan.FromSeconds(10));
    

    【讨论】:

    • Thread.Sleep() 可以工作,但其他的有点乱,我猜是因为它们是如何编码到页面中的。如果我找到修复程序会更新。
    【解决方案2】:

    我会为你们俩投票,但我还没有足够的代表点数。

    我为此工作了 4 天,问题似乎与语言栏的显示方式有关。无论是通过 CSS、XPath 还是命名,我似乎都无法引用任何内容。我现在要继续我的项目。我可以检查以确保它存在,并且通过(见下文)但实际交互由于某种原因失败。我会继续工作,我会重新审视。感谢你们的时间和精力!

    DoesElementExistX(driver, sw, "//*[@id='openCloseWrap']/img");
    DoesElementExistX(driver, sw, "//*[@id='ButtonUSFlag']");
    DoesElementExistX(driver, sw, "//*[@id='ButtoFRFlag']");
    DoesElementExistX(driver, sw, "//*[@id='ImageButton1']");
    DoesElementExistX(driver, sw, "//*[@id='ButtonDEFlag']");
    DoesElementExistX(driver, sw, "//*[@id='ButtonITFlag']");
    DoesElementExistX(driver, sw, "//*[@id='ButtonSPFlag']");
    
        #region[DoesElementExistX]
        public static void DoesElementExistX(IWebDriver driver, StreamWriter sw, String id)
        {
            var wait = new WebDriverWait(driver, TimeSpan.FromSeconds(2));
            try
            {
                wait.Until(ExpectedConditions.ElementExists(By.XPath(id)));
            }
            catch (WebDriverTimeoutException)
            {
                sw.WriteLine("FAILED - " + id);
            }
        }
        #endregion
    

    【讨论】:

      【解决方案3】:

      我对此进行了更多调查。

      您正试图点击id 的语言元素。这是一个问题,因为 Selenium 会点击元素的中心(除非另有说明),并且元素的中心位于语言区域的左侧。

      我认为这将满足您的需求:

      driver.FindElement(By.CssSelector(".topMenuAction")).Click();
      driver.FindElement(By.Id("ButtonSPFlag")).Click();
      String Check = driver.FindElement(By.CssSelector("#loginBoxInner>p")).Text;
      

      您可能需要添加Sleep(),或使用WebDriverWait()

      【讨论】:

      • 好的,我发现我们的部分问题(公共静态)丢失了。
      • 仍然给我一个 ElementNotVisibleException。在我看来,它似乎根本没有在等待。我有://定义等待变量 public static WebDriverWait wait = new WebDriverWait(driver, TimeSpan.FromSeconds(100));就在类程序内部:然后我有://尝试等到元素存在 var element = wait.Until(d => driver.FindElement(By.XPath("html/body/form/div[5]/div/ div[1]/div/p")));字符串检查 = element.Text;
      【解决方案4】:

      难道语言选择栏总是在 DOM 中,当你点击“展开”时它只是显示 html 而不是创建或注入它?

      如果是这样,那么您的“等待”将立即返回,因为您说的是“等到元素”在 HTML 中,而在您的情况下,它始终存在。

      你需要让你的等待更聪明,比如“等到显示”或者甚至“等到显示和静止”,因为你还需要等待动画完成

      【讨论】:

        猜你喜欢
        • 2021-07-21
        • 1970-01-01
        • 1970-01-01
        • 2020-04-10
        • 1970-01-01
        • 2019-12-02
        • 2021-04-01
        • 2022-01-23
        • 1970-01-01
        相关资源
        最近更新 更多