有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java单击复选框未使用Selenium webdriver工作,即使复选框已显示

使用SeleniumWebDriver,我尝试单击复选框,但无法这样做,即使显示了元素

下面是我的代码:

WebElement element = 
new WebDriverWait(webDriver, 1000).until(ExpectedConditions.presenceOfElementLocated(By.xpath(prop.getProperty(object))));
element.isDisplayed(); // returns true
element.getAttribute("type"); // returns checkbox
element.isSelected(); // returns false

element.click();
element.isSelected(); // still returns false

元素已显示,但我仍然无法选中复选框。 原因可能是什么?我哪里做错了


共 (3) 个答案

  1. # 1 楼答案

    我和你一样试过,只是用了C。我可以点击复选框,看到它在屏幕上改变了状态。但是当我试图读取复选框的选中状态时,我得到了一个异常:stale element reference: element is not attached to the page document

    如果我使用页面工厂获取WebElement,则不会发生这种情况。所以也许你应该试试Selenium的PageFactory模式。反正比较干净

  2. # 2 楼答案

    有几种处理方法,请参见以下内容:

    1. 将action类用于单击: Link to Official documentation

      正如方法文档所说

    Call perform() at the end of the method chain to actually perform the actions.

    使用Actions类实现单击的一般方法如下:

    actionsObj.moveToElement(element1).click().build().perform()
    
    1. 如果Actions类失败,有时原因可能是您收到以下异常:

      ElementNotInteractiableException[object HtmlPanelElement]没有大小和位置

    这可能意味着两件事:

    元素没有正确呈现:解决方法就是使用隐式/显式等待

    • 隐式等待:

      司机。管理()。超时()。隐式等待(50,时间单位秒)

    • 显式等待:

      WebDriverWait wait=新的WebDriverWait(驱动程序,20); element1=等待。直到(ExpectedConditions.elementtobelickable(By.className(“fa-stack-1x”))

    b.元素已渲染,但它不在屏幕的可见部分:解决方案只是滚动到元素。基于Selenium的版本,它可以以不同的方式处理,但我将提供一个适用于所有版本的解决方案:

        JavascriptExecutor executor = (JavascriptExecutor) driver;
        executor.executeScript("arguments[0].scrollIntoView(true);", element1);
    
    1. 假设所有这些都失败了,那么另一种方法是再次使用Javascript executor,如下所示: 遗嘱执行人。executeScript(“参数[0]。单击();”,要素1)
  3. # 3 楼答案

    您可以尝试移动到复选框,然后单击:

    Actions actions = new Actions(driver);
    actions.moveToElement(element).click().build().perform();
    

    或者,通过JavaScript进行单击:

    JavascriptExecutor js = (JavascriptExecutor) driver;
    js.executeScript("arguments[0].click();", element);
    

    但是,请确保您了解必须这样做的原因:WebDriver click() vs JavaScript click()