【问题标题】:Protractor - Check if a radio-button is checked or not量角器 - 检查单选按钮是否被选中
【发布时间】:2020-02-12 09:09:23
【问题描述】:

所以我在运行量角器/硒测试时遇到了这个问题,有时在测试期间已经检查了单选按钮,有时没有。

等:

<div id="TRUCK" class="radio-item checked" data-gtm="truck">

<div id="TRUCK" class="radio-item" data-gtm="deliveryOpt-truck">

你可以看到类有时有“检查”的初始化,有时没有。

我想要解决的是,我想创建一个功能,如果未选中单选按钮并且如果它已经选中,那么我们就继续。

我设法做的是:

it('Clicking Truck button', function (done) {

    browser.driver
        .then(() => browser.wait(EC.presenceOf(element(by.id("TRUCK")))), 30000, "Timed out button")
        .then(() => browser.executeScript("arguments[0].click();",element(by.id("TRUCK")).getWebElement()))
        .then(() => done());

但是问题是如果单选按钮已经被选中,它会取消选中它,这不好。再说一遍。

我正在尝试制作一个点击的功能。如果未选中单选按钮,则单击。如果它已经被检查,那么我们继续。

我怎么能做到这一点?

【问题讨论】:

    标签: selenium protractor mocha.js chai


    【解决方案1】:

    看来你很接近了。要在 class 属性不包含值 checked 时识别元素,您可以使用以下任一Locator Strategies

    • xpath

      //div[@id='TRUCK' and not(contains(@class,'checked'))]
      
    • css

      div#TRUCK:not(.checked)
      

    实际上,如果您的用例是在 class 属性没有值 checked 时调用 click(),而不是 presenceOf(),您需要使用ExpectedConditionselementToBeClickable(),您可以使用以下任一定位器策略

    • xpath:

      it('Clicking Truck button', function (done) {
      
          browser.driver
          .then(() => browser.wait(EC.elementToBeClickable(element(by.xpath("//div[@id='TRUCK' and not(contains(@class,'checked'))]")))), 30000, "Timed out button")
      
    • css:

      it('Clicking Truck button', function (done) {
      
          browser.driver
          .then(() => browser.wait(EC.elementToBeClickable(element(by.css("div#TRUCK:not(.checked)")))), 30000, "Timed out button")
      

    【讨论】:

    • 哦,对了!那是真实的。但是现在的问题是我会在测试中“失败”,因为它已经可以点击了,对吧?如果它已经被选中,有没有办法将它标记为“好”,如果我们需要点击,反之亦然?
    • 1) 单击卡车按钮
    • 完成!谢谢!我将继续看看是否有办法为此做出某种 if-else 语句。 :)
    • 顺便说一句。我尝试更改为.then(() =&gt; browser.wait(EC.elementToBeClickable(element(by.xpath("//div[@id='TRUCK']")))), 30000, "Timed out button"),但它仍然显示有关TypeError: Cannot read property 'isPresent' of undefined 的错误它不应该那样做吗?我也删除了点击功能,因此它与您的答案相同。
    • 哦,是的。我在代码的开头确实有它,所以它确实会触发它。我相信这就是我确实收到 TypeError 的原因,否则我认为我不会收到任何消息。
    【解决方案2】:

    这将检查复选框是否被选中,如果没有选中它:

    static async selectCheckbox(element: ElementFinder, markChecked: boolean) {
            const isSelected = await elementt.isSelected();
            if (isSelected !== markChecked) {
                await elementt.click();
            }
            return;
        }
    

    【讨论】:

      猜你喜欢
      • 2014-02-06
      • 2014-04-23
      • 2014-07-02
      • 2016-01-11
      • 2012-06-18
      • 2020-12-04
      • 1970-01-01
      • 2023-03-08
      相关资源
      最近更新 更多