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");
}
TA贡献1865条经验 获得超7个赞
顺便提一句。当你会与 iframe 混淆时,你应该使用哪个 iframe 来切换,那么你也可以使用类似的东西
driver.SwitchTo().DefaultContent();
或者 driver.SwitchTo().Window(driver.WindowHandles.Last());
<-- 这个切换到最后,这在某些情况下很好,当你已经切换到 iframe 的 2-3 级并且你想要返回时。我经常与两者一起使用。
当我使用弹出窗口时,我也在使用两者。
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");
- 3 回答
- 0 关注
- 343 浏览
添加回答
举报