Selenium / C# WebDriverWait Not Waiting

本文关键字:Not Waiting WebDriverWait Selenium | 更新日期: 2023-09-27 18:01:52

我有一个网站,顶部有一个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标志来更改语言。

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

Selenium / C# WebDriverWait Not Waiting

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

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));

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

我为此工作了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

我再调查了一下。

您正在尝试单击id的语言元素。这是一个问题,因为Selenium将单击元素的中心(除非另有说明),而元素的中心位于Language区域的左侧。

我认为这将完成你所需要的:

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

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

可能是语言选择栏总是在DOM中,并且当您单击"展开"时,它只是显示html而不是创建或注入它?

如果是,那么你的"wait"会立即返回,因为你说的是"wait直到元素"在HTML中,而在你的情况下,它总是在那里。

你需要让你的等待更智能,如"等待直到显示"或甚至"等待直到显示和静止",因为你也需要等待动画完成