IWebElement.Location不考虑父iframe的滚动

时间:2018-08-13 07:52:37

标签: c# selenium selenium-chromedriver

当我有一个包含iframe的网页时,iframe文档中某个元素的Location属性似乎无法解释iframe的最终滚动。因此我得到的屏幕位置不正确。

Location属性是否应该不关心父级的滚动?

html

<!DOCTYPE html>
<html>
<head>
  <script src="//code.jquery.com/jquery-3.3.1.min.js" type="text/javascript"></script>
  <script>
    $(function()
    {
      var iframe = $("iframe");
      var contents = iframe.contents();
      var body = contents.find("body");
      for (var i = 0; i < 10; i++)
      {
        var ta = $("<textarea/>");
        ta.attr("id", "txt" + i);
        ta.attr("style", "margin-bottom: 10px");
        body.append(ta);
      }
    });
  </script>
</head>
<body>
  <iframe></iframe>
</body>
</html>

硒代码

var js = (IJavaScriptExecutor) browser;
var script = $('iframe').contents().find("#txt7").get(0).scrollIntoView(false);
js.ExecuteScript(script);

var screenshot = browser.GetScreenshot();

var remoteWebDriver = (RemoteWebDriver) browser;
var iframe = remoteWebDriver.FindElementsByCssSelector("iframe");

var iframeloc = iframe.Location;

var windowHandle = browser.CurrentWindowHandle;
browser.SwitchTo().Frame(iframe);

var txtbox = remoteWebDriver.FindElementsByCssSelector("#txt7").First();
var txtboxloc = txtbox.Location;

var x = iframeloc.X + txtboxloc.X;
var y = iframeloc.Y + txtboxloc.Y;

browser.SwitchTo().Window(windowHandle);

标记了rect的网页的屏幕截图

在这里,如果您使用硒代码中给定的x和y,则会得到一个矩形。

我也得到了硒的宽度和高度,但是省略了该代码。

txtboxloc的Y值为316,似乎 是将iframe展开时所获得的位置。

Rect in wrong position

注意

txtbox对象的类型似乎为Element(我在调试和悬停时得出的结论),并且该类还具有属性LocationOnScreenOnceScrolledIntoView,该属性为126,而不是316,但我不确定如何使用。

编辑

RemoteWebElement.LocationOnScreenOnceScrolledIntoView似乎是正确的位置,而不是相对于iframe,而是相对于视口。该名称表明RemoteWebElement知道如何将元素滚动到视图中,但事实并非如此。

0 个答案:

没有答案