失败:元素不可交互:量角器/硒自动化(ElementNotVisibleException)

Posted

技术标签:

【中文标题】失败:元素不可交互:量角器/硒自动化(ElementNotVisibleException)【英文标题】:Failed: element not interactable : Protractor / Selenium Automation (ElementNotVisibleException) 【发布时间】:2019-11-25 09:57:19 【问题描述】:

我正在尝试自动化具有各种元素类型的页面。我可以使用 Protractor、TypeScript、jasmine2 组合登录并导航到该页面

当我尝试在字段中输入文本时,它会抛出

消息:失败:元素不可交互。

是否意味着整个 ng-controller 或 ng-scope 都被禁用了元素交互以实现自动化?

如果有办法在 pageLoad 上启用页面中的元素,请告诉我解决方案?

    import  browser, by, element  from 'protractor';
    import  Locator  from 'protractor/built/locators';
    import  PageObjects  from '../TestPageObjects/OR';
    import  TestData  from '../TestData/TD';

    var po= new PageObjects();
    var data= new TestData();
    describe('Login', function() 
    it('Login to Server', function() 
    browser.get('http://server01/test/testapp.html');
    element(<Locator>by.xpath(po.login_username)).sendKeys(data.username);
    element(<Locator>by.xpath(po.login_password)).sendKeys(data.password);
    element(<Locator>by.xpath(po.login_loginBtn)).click();
    element(<Locator>by.xpath(po.MainMenu_setup)).click();
    element(<Locator>by.xpath(po.SETUP_company)).click();
    element(<Locator>by.xpath(po.COMPANY_companyDetails)).click();              
browser.switchTo().frame(element(by.id('ifmPortalInfrastturcture')).getWebElement());
    browser.sleep(10000);
   browser.element(<Locator>by.xpath(po.CompanyName)).clear();
              browser.element(<Locator>by.xpath(po.CompanyName)).sendKeys('ANN');   
 );
 );

我希望行为类似于输入文本,但终端显示元素不可交互。

PageObject (PO) 选择器如下:

export class PageObjects

    public login_username: string ='//*[@id="username"]';
    public login_password: string ='//*[@id="password"]';
    public login_loginBtn: string ='//*[@id="btnSubmit"]';
    public MainMenu_setup: string ='//a[span[text()="Setup"]]';
    public SETUP_company:  string ='//a[span[text()="Company"]]';
    public COMPANY_companyDetails:  string ='//a[span[text()="Company Details"]]'
    public CompanyName: string = '//label[contains(.,"Company Name")]/following::input[1]';
    //a[span[text()="Receipts"]]
    //a[span[text()="Control Text"]]

HTML 页面如下:

<html xmlns="http://www.w3.org/1999/xhtml" ng-app="portalInfrastructure" dir="ltr">
<head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta http-equiv="Content-Type" content="text/html;charset=UTF-8" />
    <title>iProof Axon</title>
    <link rel="icon" href="favicon.ico" type="image/ico" />
    <style>

@font-face 
    font-family: 'FontAwesome';
    src: url('iProofCDN/Templates/Default/Styles/LTR/assets/css/Common/icons/fontawesome/fonts/fontawesome-webfont.eot?v=4.7.0');
    src: url('iProofCDN/Templates/Default/Styles/LTR/assets/css/Common/icons/fontawesome/fonts/fontawesome-webfont.eot?#iefix&v=4.7.0') format('embedded-opentype'), 
         url('iProofCDN/Templates/Default/Styles/LTR/assets/css/Common/icons/fontawesome/fonts/fontawesome-webfont.woff2?v=4.7.0') format('woff2'), 
         url('iProofCDN/Templates/Default/Styles/LTR/assets/css/Common/icons/fontawesome/fonts/fontawesome-webfont.woff?v=4.7.0') format('woff'), 
         url('iProofCDN/Templates/Default/Styles/LTR/assets/css/Common/icons/fontawesome/fonts/fontawesome-webfont.ttf?v=4.7.0') format('truetype'), 
         url('iProofCDN/Templates/Default/Styles/LTR/assets/css/Common/icons/fontawesome/fonts/fontawesome-webfont.svg?v=4.7.0#fontawesomeregular') format('svg');
    font-weight: normal;
    font-style: normal


@keyframes spin 
    0% 
        transform: rotate(0deg);
    

    100% 
        transform: rotate(360deg);
    

    </style>
</head>

<body ng-controller="PortalInfrastructureController as menuList" class="pace-done " ng-init='setPageUrlByPageType("Authenticate", "#pageManager")' id="bdyPageManager">
    <div id="pageManager"></div>
    <div id="MultiWindowRight" class="noItem " style="display:none">
        <a href="#" class="ToggleRightMenu"><img data-imgsrc="/Templates/Default/Styles/LTR/assets/images/RightArrow.png" /></a>
        <div class="MultiWindow"></div>
    </div>    
    <script type="text/javascript" src="iProofCDN/Templates/Default/Scripts/JsBundle/Common/ProofConfig.js"></script>
</body>
</html>

<script type="text/javascript">
        window.top.ScriptLoader('PageManager', window.document, function () 
            //default
        );
</script>

【问题讨论】:

能否提供 HTML 代码和 po 的选择器? 见AngularJS Developer Guide - Using Protractor。 嗨 @ Yevhen,我已经编辑了帖子并添加了 PO 选择器代码和 HTML 代码。 如果我在 ChromeDeveloperTools 的“元素”选项卡中进行搜索,则在页面中,//html[namespace-uri()='w3.org/1999/xhtml']:我得到 4 个值.该元素位于 iFrame ifmPortalInfrastturcture 内,并且此框架位于第一个 XML 命名空间内。 【参考方案1】:

我的一位同事通过一些研究找到了解决方案。

容器元素被隐藏以供访问,我们使用以下脚本解锁:

JavascriptExecutor 执行器 = (JavascriptExecutor)驱动程序; executor.executeScript("document.getElementById('Parks').style.display='block';");

注意:名为“Parks”的 Div 是 xmlns 中的一个子级,它又是 iFrame 的一个子级。

【讨论】:

以上是关于失败:元素不可交互:量角器/硒自动化(ElementNotVisibleException)的主要内容,如果未能解决你的问题,请参考以下文章

Stack:WebDriverError:元素不可交互-量角器e2e

当元素不是按钮且在 Selenium 中不可定位时,如何查找在网页中单击了哪个元素? (HTML,硒)[关闭]

量角器+故事书:失败:使用定位器找不到元素:By(css选择器)

尝试自动化流程时出现元素不可交互错误

使用量角器在 Shadow-root 中定位元素

selenium web 自动化中的元素不可交互异常