当我有一个包含iframe的网页时,iframe文档中某个元素的Location属性似乎无法解释iframe的最终滚动。因此我得到的屏幕位置不正确。
Location属性是否应该不关心父级的滚动?
<!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);
在这里,如果您使用硒代码中给定的x和y,则会得到一个矩形。
我也得到了硒的宽度和高度,但是省略了该代码。
txtboxloc
的Y值为316,似乎
是将iframe展开时所获得的位置。
txtbox
对象的类型似乎为Element
(我在调试和悬停时得出的结论),并且该类还具有属性LocationOnScreenOnceScrolledIntoView
,该属性为126,而不是316,但我不确定如何使用。
RemoteWebElement.LocationOnScreenOnceScrolledIntoView
似乎是正确的位置,而不是相对于iframe,而是相对于视口。该名称表明RemoteWebElement
知道如何将元素滚动到视图中,但事实并非如此。