为了账号安全,请及时绑定邮箱和手机立即绑定

无法从 HTML 网页获取元素

无法从 HTML 网页获取元素

C#
蝴蝶不菲 2021-11-28 18:52:25
我正在尝试使用 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?
查看完整描述

3 回答

?
临摹微笑

TA贡献1982条经验 获得超2个赞

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


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


使用索引:


索引从第 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>>);

目前,上述 URL 中没有框架名称/ID。因此,您不能使用框架名称或 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");

}


查看完整回答
反对 回复 2021-11-28
?
莫回无

TA贡献1865条经验 获得超7个赞

顺便提一句。当你会与 iframe 混淆时,你应该使用哪个 iframe 来切换,那么你也可以使用类似的东西

driver.SwitchTo().DefaultContent();

或者 driver.SwitchTo().Window(driver.WindowHandles.Last());<-- 这个切换到最后,这在某些情况下很好,当你已经切换到 iframe 的 2-3 级并且你想要返回时。我经常与两者一起使用。

当我使用弹出窗口时,我也在使用两者。


查看完整回答
反对 回复 2021-11-28
?
小怪兽爱吃肉

TA贡献1852条经验 获得超1个赞

作为 iframe 中的元素,首先转到 iframe,然后找到要运行的元素


IWebElement FirstIFrame= driver.FindElement(By.XPath("//iframe[@src='index.php']"));

driver.SwitchTo().Frame(FirstIFrame);


//Now perform operations 

 IWebElement query = driver.FindElement(By.Name("href"));

 query.SendKeys("test");


查看完整回答
反对 回复 2021-11-28
  • 3 回答
  • 0 关注
  • 343 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信