在Protractor JS中使用“if语句”时如何解决关于“无效select器”的错误?

我想要使​​用一个不可见的元素作为一个条件,如果它提出了X和否则做Y.

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

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

这是我有问题的testing用例:

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); }); } }); 

这是元素= 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); 

在任何声明之外发生。 但是所有的Protractor(真正的webdriver)神奇的诺言解决发生在每个it创build的ControlFlow。 所以,我认为这不会像你期望的那样。

第二:

 if (msgBox === false) { 

正在检查expect的结果,这是一个承诺(如果有的话)。 我非常有信心它不是一个布尔值。 无论如何,你试图改变itfunction将执行,但这需要执行一些量angular器代码,这是不是真的会工作。

它看起来像你想检查页面,决定它的“风味”,然后针对不同的风味(带或不带文本框)运行不同的testing。 这似乎是一个合理的想法,但我不认为量angular器有一个很好的expression方式。 (我想很多人会build议你设置一些东西,这样你的testing就可以知道哪些情况会发生,并且会导致两套代码的执行。这种条件方法意味着一个testing“通过”可能没有行使你的所有代码。 )

既然你说这个问题发生在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)"]'));