当我运行以下程序时,它运行得非常好,直到我填写webclip部分的表单。一旦它到达那里它说无法找到id“txtTemplateName”。我直接从Inspecting元素中复制并粘贴了该名称。这并不是说我没有给它足够的时间加载,我过去已经给了它整整5秒钟以确保,但仍然没有。
using OpenQA.Selenium;
using OpenQA.Selenium.Firefox;
using System.Diagnostics;
using System.Linq;
namespace Build1Evan
{
class Program
{
static void Main(string[] args)
{
IWebDriver driver1 = new FirefoxDriver();
driver1.Navigate().GoToUrl("URL");
Process.Start(@FILE"); // This is just an Auto IT Script to get me by a login window
bool loginCheck1 = driver1.FindElements(By.Id("btnLoginAgain")).Count() > 0;
if (loginCheck1 == true)
{
driver1.FindElement(By.Id("btnLoginAgain")).Click();
}
System.Threading.Thread.Sleep(500);
driver1.FindElement(By.LinkText("Configuration")).Click();
System.Threading.Thread.Sleep(500);
driver1.FindElement(By.LinkText("Payloads")).Click();
System.Threading.Thread.Sleep(500);
driver1.FindElement(By.PartialLinkText("WebClip")).Click();
// BELOW IS WHERE I ENCOUNTER THE ISSUE
System.Threading.Thread.Sleep(500);
driver1.FindElement(By.Id("txtTemplateName")).SendKeys("TESTING");
}
}
}
当我尝试选择表单中的任何其他元素时,我也会遇到错误,而不是按钮或其他文本字段。
编辑:PHOTO AS ASKED
编辑2:PHOTO 2同样只是一个FYI我使用Selenium IDE没有任何问题,它可以轻松地选择元素并填充它。
答案 0 :(得分:2)
根据您的屏幕截图,我认为您的应用使用<object id="panelcontentobject" data="...
嵌入了表单。
如果表单实际上在object标记内,则必须创建object标记的WebElement,然后使用JavaScriptExecutor检索属性或与表单交互。 例如,
IWebElement objectTag= driver.FindElement(By.Id("panelcontentobject"));
IJavaScriptExecutor js = driver as IJavaScriptExecutor;
js.ExecuteScript("return (arguments[0].contentDocument.getElementById('txtTemplateName')).click()",objectTag);
请参阅http://aksahu.blogspot.com/2015/05/dealing-with-object-tags-in-selenium-webdriver.html?m=1
中的示例答案 1 :(得分:1)
表单可能在iframe
内,您需要先切换到它,然后才能对其中的元素执行操作:
IWebElement frame = driver.FindElement(By.Id(frameId));
driver.SwitchTo().Frame(frame);
您还可以使用显式等待来确保您想要的元素可见,并且您可以与它进行交互:
WebDriverWait wait = new WebDriverWait(driver, TimeSpan.FromSeconds(10));
wait.Until(ExpectedConditions.ElementIsVisible(By.Id("txtTemplateName"))).SendKeys("TESTING");