我目前正在尝试使用Selenium和C#单击网页上的元素。 我需要单击基于具有文本"Test App"的子元素的 Div 元素。
这是对象的 HTML 代码段;
<div class="application_items">
<a href="www.google.com" target="_self">
<div class="homePageItems">
<div class="small" style="display: block;">
<div class="AppLabel">Test App</div>
</div>
<div class="big" style="display: none;">
<div class="AppLabel">Test App</div>
<div class="underTitle"></div>
</div>
</div>
</a></div>
这是我的 C# 代码,用于尝试访问应用程序名称"测试应用程序"的首次出现;
Element(By.XPath("//div[@class='small']/*[text()[contains(., 'Test App')]]"));
当它运行时,我收到一个错误;
OpenQA.Selenium.ElementNotInteractableException: 'Element <div class="AppLabel"> could not be scrolled into view'
我认为错误可能是因为程序正在访问第二次出现的"应用程序测试",所以我尝试将div 设置为类"大"可见(显示:块;使用以下代码,但它似乎没有帮助;
IWebElement elem = Driver.FindElement(By.XPath("//div[@class='small']/div[text()[contains(., 'Test App')]]"));
String js = "arguments[0].style.height='auto'; arguments[0].style.display='block';";
((IJavaScriptExecutor)Driver).ExecuteScript(js, elem);
如果之前有人问过类似的事情,我很抱歉,我花了一段时间浏览类似的主题,但没有找到我需要的东西。 如果有人能指出我正确的方向,那将不胜感激。
您可以获取所有元素,将它们过滤为仅可见的元素,然后单击第一个(或其他(元素。
IReadOnlyCollection<IWebElement> elems = Driver.FindElements(By.XPath("//div[.='Test App']")).Where(e => e.Displayed).ToList();
elems.ElementAt(0).Click();
您也可能需要添加等待以确保页面的一部分已加载。
根据您提供的 HTML 单击带有文本的应用程序的首次外观作为测试应用程序,您可以使用以下代码行之一:
-
CssSelector
:Element(By.CssSelector("div.homePageItems > div.small > div.AppLabel"));
-
XPath
:Element(By.XPath("//div[@class='homePageItems']/div[@class='small']/div[@class='AppLabel' and contains(., 'Test App')]"));
你可以通过使用类名来使用,更正代码,因为我不太了解 C 尖锐
driver.FindElement(By.ClassName("AppLabel")).Click();
你也可以使用xpath。
driver.FindElement(By.XPath(“//div[@class='small']/div[text()='Test App'])).Click();
IReadOnlyCollection<IWebElement> elems = Driver.FindElements(By.XPath("//div[.='Test App']")).Where(e => e.Displayed).ToList();
elems.ElementAt(0).Click();
我正在使用它非常适合我