【发布时间】: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,但会尝试您的脚本注入