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标志来更改语言。
谁能提供任何帮助,为什么我的等待不会暂停?
您正在启动等待,但不等待任何内容。您可能想做类似的事情:
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中,而在你的情况下,它总是在那里。
你需要让你的等待更智能,如"等待直到显示"或甚至"等待直到显示和静止",因为你也需要等待动画完成