c# - OpenQA.Selenium.NoSuchElementException:使用 Selenium 和 C# 在页面上定位元素时无法定位元素错误
问题描述
我正在尝试抓取睡觉
页面中的文本edited out the site
它有css选择器:
#autocplt_wrap > ul:nth-child(1) > li:nth-child(1) > span:nth-child(1) > a:nth-child(1)
和 x 路径:
/html/body/div[2]/div[1]/div[3]/div[2]/div[1]/div/div[1]/div[2]/div/div/ul[1]/li/span/a[1]
我的代码是:
IWebDriver driver = new FirefoxDriver();
WebDriverWait wait = new WebDriverWait(driver, TimeSpan.FromSeconds(10));
//load webdriver
driver.Manage();
driver.Navigate().GoToUrl("https://dict.naver.com/linedict/zhendict/#/cnen/home");
driver.FindElement(By.ClassName("ac_input")).SendKeys("睡觉" + Keys.Enter);
driver.FindElement(By.CssSelector("#autocplt_wrap > ul:nth-child(1) > li:nth-child(1) > span:nth-child(1) > a:nth-child(1)"));
无论我尝试什么,我总是得到错误:
Unhandled exception. OpenQA.Selenium.NoSuchElementException: Unable to locate element: #autocplt_wrap > ul:nth-child(1) >
li:nth-child(1) > span:nth-child(1) > a:nth-child(1)
at OpenQA.Selenium.Remote.RemoteWebDriver.UnpackAndThrowOnError(Response errorResponse)
at OpenQA.Selenium.Remote.RemoteWebDriver.Execute(String driverCommandToExecute, Dictionary`2 parameters)
at OpenQA.Selenium.Remote.RemoteWebDriver.FindElement(String mechanism, String value)
at OpenQA.Selenium.By.<>c__DisplayClass29_0.<CssSelector>b__0(ISearchContext context)
at OpenQA.Selenium.By.FindElement(ISearchContext context)
at OpenQA.Selenium.Remote.RemoteWebDriver.FindElement(By by)
解决方案
所需元素是动态元素,因此要提取文本睡觉,您必须诱导WebDriverWait等待所需元素ElementIsVisible()
,您可以使用以下任一定位器策略:
CssSelector
:Console.WriteLine(new WebDriverWait(driver, TimeSpan.FromSeconds(20)).Until(ExpectedConditions.ElementIsVisible(By.CssSelector("a.srchword[data-entryid]"))).GetAttribute("innerHTML"));
XPath
:Console.WriteLine(new WebDriverWait(driver, TimeSpan.FromSeconds(20)).Until(ExpectedConditions.ElementIsVisible(By.XPath("//a[@class='srchword' and @data-entryid]"))).GetAttribute("innerHTML"));
与DotNetSeleniumExtras.WaitHelpers
_nuget
CssSelector
:Console.WriteLine(new WebDriverWait(driver, TimeSpan.FromSeconds(10)).Until(SeleniumExtras.WaitHelpers.ExpectedConditions.ElementIsVisible(By.CssSelector("a.srchword[data-entryid]"))).GetAttribute("innerHTML"));
XPath
:Console.WriteLine(new WebDriverWait(driver, TimeSpan.FromSeconds(10)).Until(SeleniumExtras.WaitHelpers.ExpectedConditions.ElementIsVisible(By.XPath("//a[@class='srchword' and @data-entryid]"))).GetAttribute("innerHTML"));
您可以在WebDriverWait is not waiting for the element I specified中找到相关讨论
参考
您可以在以下位置找到一些关于NoSuchElementException的相关讨论:
推荐阅读
- sql - 需要对 Hive 中的列进行硬编码,并附加一个自定义单词以及表中的 column_name
- cypress - 如何使用 cypress 关闭当前窗口/选项卡
- proxy - 无法在公司防火墙后面运行 thinkorswim:“无法找到请求目标的有效认证路径”
- java - 模拟等待线
- excel - Power Query 无法识别 PowerBI 可以识别的数据
- powershell - 如何在 CSV 中匹配多行中的值
- python - 如何根据 ID 和指向 df2 中列名称的值从另一个数据帧 (df2) 中的列获取值。蟒蛇/熊猫
- python-3.x - smtplib 发送邮件的问题
- reactjs - 当数据未更新时,防止响应查询在用户操作时重新获取数据
- postgresql - 在 Windows 上使用 x64 postgresql 10.16 安装程序时,pgAdmin4 无法启动