量角器 - 检查单选按钮是否被选中

Protractor - Check if a radio-button is checked or not

所以我遇到了这个问题,我 运行 进行了 protractor/selenium 测试,有时在测试期间已经检查了一个单选按钮,有时却没有。

等等:

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

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

在哪里你可以看到 class 有时有 "checked" init 有时没有。

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

我设法做到的是:

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

但是问题是,如果单选按钮已经被选中,它将取消选中它,这是不好的。又是这样。

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

我怎样才能做到这一点?

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

  • xpath:

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

    div#TRUCK:not(.checked)
    

实际上,如果您的用例是在 class 属性没有值 checked[= 时调用 click() 49=],而不是 presenceOf(),您需要使用 ExpectedConditions elementToBeClickable(),您可以使用以下任一 Locator Strategies:

  • 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")
    

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

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