首页 > 解决方案 > 无法从 HTML 网页获取元素

问题描述

我正在尝试使用 Selenium 在 C# 中填充 HTML 网页(http://wasitviewed.com),但无论我尝试什么,当我尝试找到具有以下错误的网站元素时,它总是崩溃:

OpenQA.Selenium.NoSuchElementException: 'no such element: Unable to locate element: {"method":"name","selector":"href"}

我正在使用以下代码:

using (IWebDriver driver = new ChromeDriver())
{
    driver.Navigate().GoToUrl("http://www.wasitviewed.com/");
    IWebElement query = driver.FindElement(By.Name("href"));
    query.SendKeys("test");
}

在此处输入图像描述

我也尝试过使用 xPath,但这也失败了。

有没有一种更简单的方法可以找到网页的元素,或者有没有一种方法可以让我遍历整个网页以找到不同的元素及其各自的 id?

标签: c#.netseleniumselenium-webdriverselenium-chromedriver

解决方案


在上面提到的 URL 中,所有元素都驻留在 iframe 中。因此,您需要在找到查询元素之前将焦点移动到框架中,否则NoSuchElementException将被抛出。

每当 iframe 中存在任何元素时,您都需要使用以下任何一种方法将焦点移动到框架中。

使用索引:

索引从第 0 帧开始。因此,您可以使用索引切换到帧,如下所示

driver.SwitchTo().Frame(0);//Here only one frame is available.so, Index is 0

使用框架名称或 ID:

通过其(框架)名称或 ID 选择框架。name 属性总是优先于 id 属性。

driver.SwitchTo().Frame(<<Frame Name or ID>>);

目前,框架名称/ID 在上述 URL 中不可用。因此,您不能使用框架名称或 ID。

使用框架 WebElement:

您需要WebElement使用任何一种定位器策略找到框架(Name,Id,ClassName,TagName,XPath,CssSelector),它可用于将焦点移动到相应的框架。

//Here only one frame is available.So, I have used FindElement
var frameElement= driver.FindElement(By.TagName("iframe"));
driver.SwitchTo().Frame(frameElement);

工作代码:

选项1 :

using (IWebDriver driver = new ChromeDriver())
{
    driver.Navigate().GoToUrl("http://www.wasitviewed.com/");
    driver.SwitchTo().Frame(0);
    IWebElement query = driver.FindElement(By.Name("href"));
    query.SendKeys("test");
}

选项 2:

using (IWebDriver driver = new ChromeDriver())
{
    driver.Navigate().GoToUrl("http://www.wasitviewed.com/");
    var frameElement= driver.FindElement(By.TagName("iframe"));
    driver.SwitchTo().Frame(frameElement);
    IWebElement query = driver.FindElement(By.Name("href"));
    query.SendKeys("test");
}

推荐阅读