c# - 无法在 C# 中使用 WebDriverWait 显式等待汉堡菜单
问题描述
我最近一直在用 c# 中的 selenium 搞乱。我偶然发现了一个我目前无法解决的问题。基本上,我试图在网站的左上角打开一个汉堡“菜单”并将鼠标悬停在其第一个菜单项上:“Loterie”,这应该会触发另一个子菜单在汉堡菜单旁边弹出一些“子选项”到“彩票”。
场景将是:菜单 -> Loterie -> 用户能够看到这些选项:Sportka / Eurojackpot / Rychle Kacky / 等等......
首先,我使用 Thread.Sleep 来完成我的任务并且它工作正常,如下所示:
m_driver = new ChromeDriver("C:/Users/richard/source/repos/ConsoleApp43");
m_driver.Url = "https://www.sazka.cz/";
m_driver.Manage().Window.Maximize();
IWebElement subMenu = m_driver.FindElement(By.Id("header-menu")); subMenu.Click();
IWebElement element = m_driver.FindElement(By.XPath("//*[@id='menuElem']/li[1]/a"));
Actions action = new Actions(m_driver);
System.Threading.Thread.Sleep(1000);
action.MoveToElement(element).Perform();
但是,有人提到这是一种不好的做法,应该改用 WebDriverWait 类。所以我尝试使用 WebDriverWait 类,但我无法让它运行。
我找到了几个应该解决我的问题的解决方案,但它们似乎都没有工作,例如
Selenium C# 中的显式等待不起作用。怎么了?
隐式等待命令不起作用-selenium webdriver C#
如何让 webDriver 等待页面加载(C# Selenium 项目)
我最终得到了这样的东西。但是,我仍然无法运行它,因为使用以下代码,由于某种原因,只有 50% 的测试运行正确执行。
m_driver = new ChromeDriver("C:/Users/richard/source/repos/ConsoleApp43");
m_driver.Url = "https://www.sazka.cz/";
m_driver.Manage().Window.Maximize();
IWebElement menu = m_driver.FindElement(By.Id("header-menu")); menu.Click();
WebDriverWait wait = new WebDriverWait(m_driver, TimeSpan.FromSeconds(1));
var loterie = wait.Until(SeleniumExtras.WaitHelpers.ExpectedConditions.ElementIsVisible(By.XPath("//*[@id='menuElem']/li[1]/a")));
Actions action = new Actions(m_driver);
action.MoveToElement(loterie).Build().Perform();
有人可以帮我吗?
编辑:主要问题是,有时当我运行测试时,代码会正常工作(=汉堡菜单向下滚动,鼠标悬停在“Loterie”上)。但是在其他一些情况下,汉堡菜单只会向下滚动,鼠标不会悬停在“彩票”上,因此用户只剩下打开的汉堡菜单,“子菜单”不会被触发。
解决方案
要调用url https://www.sazka.cz/
,请单击Burger,将鼠标悬停在Loterie上,然后单击click()
文本为Sportka的元素,您可以使用以下解决方案:
m_driver = new ChromeDriver("C:/Users/richard/source/repos/ConsoleApp43");
m_driver.Url = "https://www.sazka.cz/";
m_driver.Manage().Window.Maximize();
new WebDriverWait(m_driver, TimeSpan.FromSeconds(20)).Until(SeleniumExtras.WaitHelpers.ExpectedConditions.ElementToBeClickable(By.XPath("//a[@class='show-sidebar' and @id='header-menu']"))).Click();
var loterie = new WebDriverWait(m_driver, TimeSpan.FromSeconds(20)).Until(SeleniumExtras.WaitHelpers.ExpectedConditions.ElementIsVisible(By.XPath("//div[@class='menu-box open']//a[contains(@href,'loterie')]")));
new Actions(m_driver).MoveToElement(loterie).Build().Perform();
var sportka = new WebDriverWait(m_driver, TimeSpan.FromSeconds(20)).Until(SeleniumExtras.WaitHelpers.ExpectedConditions.ElementToBeClickable(By.XPath("//div[@class='menu-box open']//a[contains(@href,'loterie')]//following::ul[1]/li/a[contains(.,'Sportka')]")));
new Actions(m_driver).MoveToElement(sportka).Click().Build().Perform();
推荐阅读
- reactjs - 基于子组件有条件地渲染包装代码
- javascript - 是否可以在 Windows 10 的 Windows 网络上远程获取触摸屏设备的当前坐标 X、Y?
- python - 用于 juputer notebook 的 Handcalcs 插件中的平方根问题
- javascript - Rijndael encryption VB to Javascript
- wordpress - 基于 ACF 转发器子字段自定义分类的查询帖子
- audio - 有没有办法在 C# 中创建虚拟扬声器或麦克风?
- python - 在对数据集进行预处理时,机器学习中的 Standard Scaler 和 MinMax Scaler 之间的主要区别是什么?
- c++ - 检测到“RuntimeLibrary”不匹配:值“MD_DynamicRelease”与应用程序 obj 中的值“MTd_Static debug”不匹配
- javascript - 我的侧导航仍然在右侧可见
- ios - 通过XIB创建自定义视图时如何消除多余的contentView?