C# 可以在iFrame中获取元素,但.Click()不执行任何操作

C# 可以在iFrame中获取元素,但.Click()不执行任何操作,c#,selenium,iframe,C#,Selenium,Iframe,我正在使用来自C#的Selenium来尝试定期在网站上搜索并获取更新的数据。不幸的是,该网站需要一个登录名,我不能公开,所以我不能给出任何类型的可复制测试用例 使用Selenium IDE,我制作了一个脚本,可以成功登录并提取数据,因此任务是可能的。但是,当将该脚本导出到C#时,尝试使用过程中出现的iframe时会失败 通过阅读,我发现我需要添加代码来显式查找并切换到iframe,我已经这样做了 driver.SwitchTo().Frame(driver.FindElement(By.Id("

我正在使用来自C#的Selenium来尝试定期在网站上搜索并获取更新的数据。不幸的是,该网站需要一个登录名,我不能公开,所以我不能给出任何类型的可复制测试用例

使用Selenium IDE,我制作了一个脚本,可以成功登录并提取数据,因此任务是可能的。但是,当将该脚本导出到C#时,尝试使用过程中出现的iframe时会失败

通过阅读,我发现我需要添加代码来显式查找并切换到iframe,我已经这样做了

driver.SwitchTo().Frame(driver.FindElement(By.Id("popup_iframe")));
在该框架内,左侧有一个区域,其中包含要单击的项目。单击每个项目时,都会将可见控件更改为右侧。当我在这一点中断并手动单击时,一切都按预期进行。如果我调用表示该对象的IWebElement。单击,则不会发生任何事情,因此程序的下一步失败,因为它获取另一个对象,尝试单击该对象,并且由于该对象不可见而引发异常

我会在两次操作之间留出5s的延迟时间,以防需要延迟

该区域网站上的代码为

<div id="ctl00_popup_workarea_left_container" class="popup-workarea-left-container" style="overflow: auto; height: 337px; display: block;">
 <a id="LBTN1" class="navbutton navbutton_Disabled_Selected">Basic Search</a>
 <a id="LBTN2" class="navbutton">Advanced Search</a>
 <a id="LBTN3" class="navbutton">Permit Holder Search</a>
 <a id="LBTN4" class="navbutton">Assessor Search</a>
</div>
我也试过了

Actions act = new Actions(driver);          
act.MoveToElement(driver.FindElement(By.Id("LBTN3"))).Click().Perform();
除了这些不会抛出异常这一事实之外,我已经确认我正在以交互方式获取IWebElement

driver.FindElement(By.Id("LBTN3"))
{Element (id = f42435b5-139c-4334-be12-4a1f9f48221f)}
    Coordinates: {OpenQA.Selenium.Remote.RemoteCoordinates}
    Displayed: true
    Enabled: true
    Id: "f42435b5-139c-4334-be12-4a1f9f48221f"
    Location: {X = 0 Y = 112}
    LocationOnScreenOnceScrolledIntoView: {X = 0 Y = 112}
    Selected: false
    Size: {Width = 200 Height = 29}
    TagName: "a"
    Text: "Permit Holder Search"
    WrappedDriver: {OpenQA.Selenium.Firefox.FirefoxDriver}

所以我得到了元素。HTML似乎表明它确实是元素——我没有意外地使用包含它的东西的ID。在Selenium IDE中创建的原始脚本工作得很好-我只是无法自动执行它,所以它会在早期无人参与的情况下启动。我知道这是含糊不清的,因为我不能给人们播放的机会来复制它,但是有人知道会出什么问题以及如何修复吗?

为了完整性,我想我最好在这里给出一个答案

我从未发现为什么我所做的尝试都不起作用,但我发现在页面中注入Javascript来单击我想要单击的元素确实起作用。因此,假设.FindElement()能够让元素单击,那么下面的代码片段在许多IWebElement.click()被证明不起作用的地方对我有用

IWebElement ibtn3 = driver.FindElement(By.Id("LBTN3"));
IJavaScriptExecutor executor = (IJavaScriptExecutor)driver;
executor.ExecuteScript("arguments[0].click();", ibtn3);

点击是否与Chrome一起工作?不确定你的意思-我在Firefox中工作,因为这似乎是Selenium/Webdriver的首选。在Chrome中,它完全是手动工作的,就像在Firefox中一样。在Firefox中,如果我在尝试单击按钮后中断代码,然后在继续代码之前手动单击按钮,那么接下来的步骤将正确执行。我的意思是,当使用Chrome浏览器而不是Firefox浏览器执行时,您的C#代码是否工作正常。如果它能工作,那就是gecko驱动程序中的一个bug。如果不是,那么原因是您的代码。但是由于你没有发布一个可复制的例子,我们无法解释为什么它不起作用。Chrome目前有这个问题,没有尝试Firefox,但要尝试你的脚本注入是的,它在Chrome中对我起作用,我已经尝试过所有其他组合,谢谢分享
IWebElement ibtn3 = driver.FindElement(By.Id("LBTN3"));
IJavaScriptExecutor executor = (IJavaScriptExecutor)driver;
executor.ExecuteScript("arguments[0].click();", ibtn3);