【问题标题】:Unable to locate an element in an html dom which is inside and object tag in selenium无法在 html dom 中定位元素,该元素位于 selenium 内部和对象标记中
【发布时间】:2020-06-11 17:16:19
【问题描述】:

我正在使用 c# 中的 selenium 对 html 页面进行自动化测试,其中父/外部 html 页面有一个对象标签,而在这个对象标签内,我们有另一个 html 页面。这是示例 html 的外观。

<!DOCTYPE html>
<html>
<head></head><body id="divAjaxParent">
<div id="_ctl0_BodyContent_divObject" class="object-loading" style="height: 100%; overflow: hidden; padding-bottom: 60%; position: relative; width: 100%;">
<object id="abcd1234" style="height: 100%; left: 0; position: absolute; top: 0; width: 100%;" data="abcd.ashx?action=dosimething&amp;sessionguid=1234567890">
#document == $0
<!DOCTYPE html>
<html lang="en"><head>
  <meta charset="utf-8">
  <title>Tool title</title>
  <base href="/deploy/">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1">
<body class="no-scrolling">
  <app-root _nghost-c0="" ng-version="7.1.4">
  <div _ngcontent-c0=""><div _ngcontent-c0="" class="route-placeholder clearfix">
    <app-dnl-dummyapp _nghost-c1="" class="ng-star-inserted">
    <clr-modal _ngcontent-c1="" _nghost-c3="" class="ng-tns-c3-0 open">
    <button _ngcontent-c3="" class="close ng-tns-c3-0 ng-star-inserted" type="button" aria-label="Close" style="">
    <clr-icon _ngcontent-c3="" class="ng-tns-c3-0" shape="close" role="none">
    <svg version="1.1" viewBox="0 0 36 36" preserveAspectRatio="xMidYMid meet" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" focusable="false" role="img">
    <path class="clr-i-outline clr-i-outline-path-1" d="sdfggtrrr"></path></svg></clr-icon></button>
    <div _ngcontent-c3="" class="modal-title-wrapper" tabindex="0" id="clr-id-0"><div _ngcontent-c1="" class="modal-title font-28-regular">What do you want to do?</div></div></div>
    <div _ngcontent-c1="" class="modal-body" tabindex="0"><p _ngcontent-c1="">Description about the button options</p></div><div _ngcontent-c1="" class="modal-footer">
    <button _ngcontent-c1="" class="btn btn-outline" type="button">DO SOMETHING</button>
    <button _ngcontent-c1="" class="btn btn-primary verfy-btn" type="button">SO SOMTHING ELSE</button></div></div></div>
    <div _ngcontent-c3="" class="clr-sr-only">End of Modal Content</div></div>
    <div _ngcontent-c3="" class="modal-backdrop ng-trigger ng-trigger-fade" aria-hidden="true"></div></div></clr-modal>
    </app-dnl-dummyapp></div><a _ngcontent-c0="" class="invisible" href=""></a><div _ngcontent-c0="" appsizewatcher="" id="dummy_12345"></div></div></app-root>
</body></html>
</object>
</div></section></body></html>

我需要找到“做某事”和“做其他事情”按钮并单击它。 我尝试过使用切换帧方法,但它没有用。 我也尝试过更改窗口句柄,但也没有用。

通过 findelement 函数,我可以上到对象标签,但不能超越。还尝试在 stackoverflow 中搜索解决方案,但找不到相关位。有人可以帮忙吗。

================================================ ====================

我对此有所了解,因此编辑问题并在此处添加更多信息。解决方案是这样的。我通过 id 定位对象标签。 object 标签的 'data' 属性包含内部 html 的 url,所以我获取它。然后我需要驱动程序导航到这个内部 url。从那里我可以找到内部 html 中的元素。

var element = driver.FindElement(By.Id("abcd1234"));
string innerurl = element.GetAttribute("data");
driver.Navigate().GoToUrl(innerurl);

但是这会导致另一个问题,之前在浏览器中打开了外部 html,其中只有一部分包含内部 html,但是通过上述解决方案,内部 html 再次直接加载到浏览器中,而不是在其父 html 中。并且父母的网络元素丢失了。所以新的问题是,如何绕过它。

【问题讨论】:

    标签: c# html selenium


    【解决方案1】:

    您应该可以使用以下内容。这是角度代码,因此您可能需要为 Protractor 添加一个包装器。不过,我们总是能够在不使用 Protractor 的情况下找到元素。

    FindElement(By.XPath("//button[@class='btn btn-outline']")).Click();
    FindElement(By.XPath("//button[@class='btn btn-primary verfy-btn']")).Click();
    

    FindElement(By.XPath("//button[text()='DO SOMETHING']")).Click();
    FindElement(By.XPath("//button[text()='SO SOMTHING ELSE']")).Click();
    

    切换到另一个窗口:

        public static string SwitchToPopup()
        {
            var mainHandle = Driver.CurrentWindowHandle;
            var handles = Driver.WindowHandles;
    
            foreach (var handle in handles)
            {
                if (mainHandle == handle)
                {
                    continue;
                }
                Driver.SwitchTo().Window(handle);
                break;
            }
            var result = Url;
            return result;
    
        }
    
        public static void GoToMainHandle()
        {
            var handles = Driver.WindowHandles;
            foreach (var handle in handles)
            {
                Driver.SwitchTo().Window(handle);
                break;
            }
        }
    

    【讨论】:

    • 感谢您的回答。我已经尝试过了,但它不起作用。正如我在我的问题中提到的,定位元素仅在对象标记之前有效,而不适用于任何其他内容。它甚至没有找到对象标记之后的 html 延迟。
    • 有该页面的链接吗?
    • 不抱歉,这是一个内部应用程序,所以不能真正分享。
    • 我更新了我的答案。尝试使用它切换到 in 并查看它是否有效。如果没有整个 html,我看不到您是否有 iframe。看起来你有一个弹出窗口,所以当你完成与它的交互时尝试 SwitchToPopup 然后 GoToMainHandle。
    • 您好,再次感谢。我试过你的代码,但这也不起作用。事实上,我检查了窗口句柄计数,结果只有 1 个。我还尝试切换 iframe 以及 iframe 和窗口句柄的组合,这也不起作用:(
    猜你喜欢
    • 2015-06-08
    • 2022-01-06
    • 2021-06-21
    • 1970-01-01
    • 2020-08-02
    • 1970-01-01
    相关资源
    最近更新 更多