【问题标题】:Can get an element inside an iFrame but .Click() does nothing可以在 iFrame 中获取元素,但 .Click() 什么也不做
【发布时间】:2017-05-16 18:10:11
【问题描述】:

我正在使用 C# 中的 Selenium 尝试定期在网站上进行搜索并获取更新的数据。不幸的是,该网站需要登录,我无法公开,因此我实际上无法提供任何可重现的测试用例。

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

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

driver.SwitchTo().Frame(driver.FindElement(By.Id("popup_iframe")));

在该框架内是左侧的区域,其中包含要单击的项目。单击每个项目时都会将可见控件更改为右侧。当我此时中断并手动单击时,一切都按预期工作。如果我在代表该对象的 IWebElement 上调用 .Click,则不会发生任何事情,因此程序的下一步将失败,因为它获取另一个对象,尝试单击它并抛出异常,因为该对象不可见。

如果需要延迟,我将在操作之间留出 5 秒的延迟。

该区域网站上的代码是;

<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>

我用来获取和点击 IWebElement 的代码是

driver.FindElement(By.Id("LBTN3")).Click();

我也试过了

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 中创建的原始脚本工作正常——我只是无法自动化它,所以它在凌晨无人看管地启动。我知道这很含糊,因为我无法让人们玩来重现它,但有人知道可能出了什么问题以及如何解决吗?

【问题讨论】:

  • Chrome 的点击是否有效?
  • 不确定你的意思——我在 Firefox 中工作,因为这似乎是 Selenium/Webdriver 的首选。在 Chrome 中,它确实完全手动工作,就像在 Firefox 中一样,在 Firefox 中,如果我在尝试单击按钮后对代码进行断点,并且在让代码继续之前手动单击按钮,则下一步将正确执行。
  • 我的意思是您的 C# 代码在使用 Chrome 浏览器而不是在 Firefox 浏览器上执行时可以正常工作。如果它有效,那么它是壁虎驱动程序中的一个错误。如果不是,那么原因是您的代码。但由于您没有发布可重现的示例,我们无法说明为什么它不起作用。
  • Chrome 目前有这个问题,没有尝试使用 Firefox,但会尝试您的脚本注入

标签: c# selenium iframe


【解决方案1】:

为了完整起见,我想我最好在这里给出答案。

我从未确定为什么我所做的尝试都没有奏效,但我发现将 Javascript 注入页面以单击我想要单击的元素确实有效。所以假设 .FindElement() 能够让元素点击,下面的 sn-p 在 IWebElement.Click() 被证明不合作的许多地方为我工作。

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

【讨论】:

  • 是的,它在 Chrome 中对我有用,我已经尝试过所有其他组合,然后才起作用,谢谢分享
猜你喜欢
  • 1970-01-01
  • 2013-02-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-25
  • 2011-02-14
  • 1970-01-01
  • 2019-10-13
相关资源
最近更新 更多