无法从HTML网页获取元素

时间:2018-08-15 04:52:20

标签: c# .net selenium selenium-webdriver selenium-chromedriver

我正在尝试使用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");
}

enter image description here

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

是找到网页元素的简便方法,还是可以遍历整个网页以查找不同元素及其各自ID的方法?

5 个答案:

答案 0 :(得分:1)

在上述URL中,所有元素都驻留在iframe中。因此,您需要先将焦点移到框架中,然后再找到查询元素,否则将抛出NoSuchElementException

只要iframe中存在任何元素,就需要使用以下启动方式中的任何一种将焦点移到框架中。

使用索引:

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

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

使用框架名称或ID:

通过其(帧)名称或ID选择一个帧。名称属性始终优先于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");
}

答案 1 :(得分:0)

您所需的<input>元素位于iframe中。在iframe内的任何元素上执行操作之前,您需要切换到该位置。

IWebElement yourIFrame= driver.FindElement(By.XPath("//iframe"));
driver.SwitchTo().Frame(yourIFrame);

现在,这应该可以工作-

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

此外,一旦您完成了对iframe的处理,就可以通过-

切换回默认内容
driver.SwitchTo().DefaultContent();

答案 2 :(得分:0)

作为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");

答案 3 :(得分:0)

根据您的问题,URL http://wasitviewed.com/中的元素在<iframe>中。因此,一旦您访问 url ,您首先需要诱使 WebDriverWait 来使所需的<iframe>可用并切换到,然后您需要再次诱使 WebDriverWait ,以使所需的元素可点击,您可以使用以下解决方案:

driver.Navigate().GoToUrl("http://www.wasitviewed.com/");
new WebDriverWait(driver, TimeSpan.FromSeconds(10)).Until(ExpectedConditions.FrameToBeAvailableAndSwitchToIt(By.XPath("//iframe[@src='index.php']")));
new WebDriverWait(driver, TimeSpan.FromSeconds(10)).Until(ExpectedConditions.ElementToBeClickable(By.XPath("//input[@class='inputText' and @name='href']"))).SendKeys("test");

答案 4 :(得分:0)

顺便说一句。当您与iframe混淆时,应该使用哪个iframe进行切换,那么您也可以使用类似的

driver.SwitchTo().DefaultContent();

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

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