Protractor+Cucumber+TypeScript:CSS选择器点击失效及sleep优化问询
解决Protractor+Cucumber+TS中CSS选择器点击失效与sleep优化问题
嘿,我来帮你搞定这两个问题!咱们一个个来拆解:
一、CSS选择器点击失效的问题
你碰到的NoSuchElementError和InvalidSelectorError,主要是两个小问题导致的:
1. 传入的参数不是合法CSS选择器
你传入的href="/messages/t/"只是元素的属性值,并不是符合语法的CSS选择器。要通过href属性定位元素,得用CSS属性选择器的格式:[href="/messages/t/"](如果确定是a标签,写成a[href="/messages/t/"]会更精准)。
为啥element(by.id(idOfElement))能正常运行?因为by.id()接收的就是id属性的纯值,而by.css()需要完整的CSS选择器语法,两者的参数规则不一样哦。
2. 代码里的语法小错误
你的CSS点击步骤里多了个多余的逗号,这也会影响执行:
return await element(by.css(idOfElement,)).click() // 这里的逗号是多余的 → by.css(idOfElement,)
修正后的CSS点击步骤代码
另外建议把参数名从idOfElement改成cssSelector,避免混淆,代码如下:
Then(/^rákattintok (.*) css kóddal rendelkező gombra$/, async function (cssSelector){ // 注意:传入的必须是合法CSS选择器,比如 '[href="/messages/t/"]' await element(by.css(cssSelector)).click(); return true; });
调用这个步骤时,要传入完整的CSS选择器,比如Gherkin语句写:
Then rákattintok '[href="/messages/t/"]' css kóddal rendelkező gombra
二、优化sleep实现方案
固定browser.sleep(wait * 1000)属于硬等待,不管元素是否加载完成都会等满时间,既浪费时间又不稳定。Protractor推荐用智能等待结合ExpectedConditions来替代,它会等待元素满足条件(比如可见、可点击)后再执行操作,超时才会报错。
具体优化步骤:
- 先导入
ExpectedConditions:
import {$, browser, by, element, ExpectedConditions as EC} from 'protractor';
- 替换硬等待为智能等待(推荐),或者优化固定等待的写法:
// 方案1:智能等待(推荐)- 等待元素可点击后再执行后续操作 Then(/^várok amíg az (.*) css kiválasztóval jelölt elem kattintható lesz$/, async function (cssSelector) { const targetElement = element(by.css(cssSelector)); // 等待10秒,直到元素可点击,超时则抛出自定义提示 await browser.wait(EC.elementToBeClickable(targetElement), 10000, `元素 ${cssSelector} 超时仍不可点击`); return true; }); // 方案2:如果确实需要固定时长等待,优化写法更规范 Then(/^várok (.*) másodpercet$/, async function (waitSeconds): Promise<void> { const waitMs = parseInt(waitSeconds, 10) * 1000; await browser.sleep(waitMs); });
方案1是更专业的做法,它会根据页面实际加载情况动态调整等待时间,比硬等待更可靠高效。
内容的提问来源于stack exchange,提问作者Peter Toth
相关产品推荐
相关产品推荐

