如何解决“无效选择器”的错误当使用"if语句"在Protractor JS中

How to solve error about "invalid selector" when using "if statement" in Protractor JS?

本文关键字:quot if 语句 JS Protractor 错误 解决 何解决 无效 无效选择器 选择器      更新时间:2023-09-26

我想使用一个不可见的元素作为条件,如果它出现do X,否则做y

我已经尝试使用这个元素的类作为定位器和ng-model和绑定,但他们都没有工作:/

请您协助解决这个问题,非常感谢。

这是我的问题测试用例:

describe('LiveSite Portal - Existing client send new message', function() {
    var msgBox = expect(element(by.css(".final-container")).isPresent()).toBe(true);
    //var msgBox = element.all(by.css('#main_container > main > div > div > section > div.row.cz-content.inner-content.full-height > div > div.action.ng-scope > footer > form > div.row.form-control.textarea-holder.ng-isolate-scope.ng-hide > textarea'));
    var EC = protractor.ExpectedConditions;
    it('LiveSite - Home Page', function() {
       liveSiteHome();
    });
    if (msgBox === false) {
        it('LiveSite Portal - Existing client send new message - Message form', function() {
          browser.wait(EC.visibilityOf(element(by.xpath("//div[@class='actions-row']//a[.='Leave Your Details']"))), 10000);
          element(by.xpath("//div[@class='actions-row']//a[.='Leave Your Details']")).click();
          waitPageToLoad(); 
          expect(element(by.id("new_client_message_message")).isPresent()).toBe(true);
          element(by.css("div.row.mandatory > div.area")).click();
          element(by.id("new_client_message_title")).sendKeys("Automation message");
          element(by.id("new_client_message_message")).sendKeys("I am not logged-in client. Please call me.");
          element(by.id("new_client_message_email")).sendKeys("idanvcita@gmail.com");
        });
        it('LiveSite Portal - Existing client send new message - Welcome back for existing client', function() {
          element(by.id("new_client_message_first_name")).click();
          browser.wait(EC.visibilityOf(element(by.css("span.welcome-back"))), 10000);
          expect(element(by.css("span.welcome-back")).isPresent()).toBe(true);
        });
        it('LiveSite Portal - Existing client send new message - Messeage Sent', function() {
          element(by.name("commit")).click();
          waitPageToLoad(); 
          expect(element(by.css(".final-container")).isPresen()).toBe(true);t
        });
        it('LiveSite Portal - Existing client send new message - Back to home page', function() {
          element(by.css(".standard-button")).click();
          expect(element(by.model("email")).isPresent()).toBe(true);
          browser.driver.sleep(2000);
        });
    } else {
        it('LiveSite Portal - Send new message from the text box - Text Area', function() {
          // expect(element(msgBtn.isPresent()).toBe(true);
          element(by.xpath("//div[@id='main_container']/main/div/div/section/div[2]/div/div[2]/footer/form/div[2]/textarea")).sendKeys("Hello!'nHow are you?'nHave a good day! :)");
        });
        it('LiveSite Portal - Send new message from the text box - Message has been sent', function() {
          element(by.xpath("//div[@id='main_container']//button[.='Send']")).click();
          browser.wait(EC.visibilityOf(element(by.xpath("//div[@id='main_container']//h2[.='Quick conversation']"))), 10000);
          browser.driver.sleep(2000);
        });
    }
});

This is element = msgBox:

<a class="btn btn-void btn-with-font-round-icon engage-btn icon-lg brand-theme-before icon-env ng-binding" ng-click="goExternalUrl(contact_url)" ng-bind="truncate(livesite_actions_texts.contact, 22)" title="Leave Your Details">Leave Your Details</a>

错误:

c:'automation'tests>protractor conf.js
Using the selenium server at http://localhost:4444/wd/hub
[launcher] Running 1 instances of WebDriver
LiveSite Portal - Existing client send new message
  encountered a declaration exception - fail

Failures:
  1) LiveSite Portal - Existing client send new message encountered a declaratio
n exception
   Message:
     TypeError: Cannot read property 'matchersClass' of null
   Stacktrace:
     TypeError: Cannot read property 'matchersClass' of null
    at promiseMatchers (C:'Users'idan'AppData'Roaming'npm'node_modules'protracto
r'node_modules'jasminewd'index.js:203:38)
    at global.expect (C:'Users'idan'AppData'Roaming'npm'node_modules'protractor'
node_modules'jasminewd'index.js:221:12)
    at [object Object].<anonymous> (c:'automation'tests'msg.js:3:61)
    at [object Object].jasmine.Env.describe_ (C:'Users'idan'AppData'Roaming'npm'
node_modules'protractor'node_modules'minijasminenode'lib'jasmine-1.3.1.js:913:21
)
    at [object Object].jasmine.Env.describe (C:'Users'idan'AppData'Roaming'npm'n
ode_modules'protractor'node_modules'minijasminenode'lib'jasmine-1.3.1.js:898:15)
    at describe (C:'Users'idan'AppData'Roaming'npm'node_modules'protractor'node_
modules'minijasminenode'lib'jasmine-1.3.1.js:658:27)
    at Object.<anonymous> (c:'automation'tests'msg.js:1:63)
Finished in 0.125 seconds
1 test, 1 assertion, 1 failure
[launcher] 0 instance(s) of WebDriver still running
[launcher] chrome #1 failed 1 test(s)
[launcher] overall: 1 failed spec(s)
[launcher] Process exited with error code 1
c:'automation'tests>

这一行:

var msgBox = expect(element(by.css(".final-container")).isPresent()).toBe(true);

发生在任何it声明之外。但是所有的Protractor(实际上是webdriver)神奇的承诺解决发生在每个it上创建的ControlFlow中。所以,我不认为这是你所期望的。

第二:

if (msgBox === false) {

正在检查expect的结果,这是一个承诺(如果有的话)。我很确定它不是布尔值。在任何情况下,您都试图更改将执行哪些it函数,但这需要执行一些量角器代码,这实际上是行不通的。

看起来您想要检查页面,确定它是哪种"味道",然后针对不同的味道运行不同的测试(有或没有文本框)。这似乎是一个合理的东西,但我不认为量角器有一个很好的方式来表达它。(我想很多人会建议您设置一些东西,以便您的测试知道要期待哪种情况,并且它会导致两组代码执行。这种条件方法意味着"通过"的测试可能没有执行您的所有代码。

既然你说这个问题发生在if语句内,我假设在访问msgBox时发生这个问题。所以试着用element.all(by.css('.ng-isolate-scope ng-pristine ng-valid)'));代替element(by.css(....))

或者尝试像这样访问元素

var msgBox = element.all(by.css('[ng-click="goExternalUrl(contact_url)"]'));