我正在尝试使用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的方法?
答案 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中进行切换并且想要返回时。我经常使用两者。
在使用弹出窗口时,我也在使用。