如何解决“无效选择器”的错误当使用"if语句"在Protractor JS中
How to solve error about "invalid selector" when using "if statement" in Protractor JS?
我想使用一个不可见的元素作为条件,如果它出现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)"]'));
相关文章:
- 可以't让我的if语句处理js中的html表单输入
- 如果 a 为 false,则 if(a) === if(false)
- 如何在ReactJS JSX中执行嵌套的if-else语句
- 我已经创建了一个jquery转盘,并使用if条件来运行和停止转盘
- 正在尝试使用if和else添加类,但无法正常工作
- 在PHP中使用javascript更改页面标题'if'
- 铬:“;未捕获的语法错误:意外的标记:"
- 可以设置“;文件名"发生错误时显示的内联脚本标记的
- JS表单提交"无法使用Chrome数据保护程序加载此页面.尝试重新加载页面.调试信息:POST CISmtuK
- 检测电话窃听,即:<a href="电话:xxx">在UIWebview上
- gulp-if-javascript文件,但不在gulp-useref的特定目录中
- 使用“+="操作人员
- 如何在 API 调用后和 if 语句中启用提交按钮
- 什么是“-[1;平均值;if(!-[1,]&&!window.XMLHttpRequest)"
- KnockoutJS:无法处理绑定"if:function(){return conversations}”;
- HTML/JavaScript”;if!="不起作用
- Knockout.js"<!--ko if:-->"导致分离DOM元素的块
- 如何使用“>"AngularJS ng-if语句中的比较器
- How do i formulate "if this.children.has.not.class"
- 如何创建语句if包含"&"