当前位置: 首页 > 知识库问答 >
问题:

selenium驱动程序单击项目,然后重定向到新页面,并尝试查找上一页面的相同项目

冯枫
2023-03-14

检查一个方法的代码,该方法用于等待SeleniumWebDriver中的元素,我以这种方式调用它waitForElement(By.id(idOfElement));

public void waitForElement(By by) {
    for (int second = 0;; second++) {
        //System.out.println("seconds : " + second);
        if (second >= 15) {
            System.out.println("element not found");
            break;
        }
        try {
            if (driver.findElement(by).isDisplayed()) {
                driver.manage().timeouts().implicitlyWait(2, TimeUnit.SECONDS); 
                //System.out.println("found element before click");
                driver.findElement(by).click();
                //System.out.println("found element after click");
                return;
            }
        } catch (Exception e) {
//              e.printStackTrace();
            //System.out.println("inside exception");
        }
    }
    //System.out.println("click on element after being not found");
    driver.findElement(by).click();
}

这个方法应该找到元素并点击它

它工作得很好,本来应该单击元素然后从方法返回,但现在失败了,因为驱动程序单击了重定向到另一个页面的元素,在新页面显示驱动程序而不是从方法返回后,它进入catch异常,最后代码失败了,因为驱动程序试图找到其中的元素上一页

修复此方法有什么帮助吗?

更新:第一次单击后有一个返回如果元素被找到,它应该会退出方法,这里的问题是,有时执行代码会找到元素并单击它,但在第一次单击后没有到达代码(这是返回;)和我使用这种方法来避免元素的异常未找到,因为有时我使用等待和元素存在,但代码失败,因为元素未找到或因为异常说"超时接收来自渲染器的消息"

共有2个答案

韦繁
2023-03-14

你的问题似乎是因为你没有将驱动程序切换到新页面。所以,如果你所说的页面是指:

  • 一个新窗口:检查这个
  • 一个新标签:检查那里
寇靖
2023-03-14

这种方法是可怕的。您有很多不需要的代码,一个不需要的try | catch,如果没有抛出错误,您将尝试并单击元素两次。

我建议改写如下:

WebDriverWait wait = new WebDriverWait(driver, 15, 100);
WebElement myElement = wait.until(ExpectedConditions.elementToBeClickable(By.id("my-id")));
myElement.click();

这使用了selenium支持包中提供的ExpectedConditions类:

import org.openqa.selenium.support.ui.ExpectedConditions;
import org.openqa.selenium.support.ui.WebDriverWait;

上面的代码将创建一个Web驱动程序等待对象,该对象将等待长达15秒的条件变为true。每100ms检查一次状况。当元素解析为true时,预期条件将返回元素(在这种情况下,我们正在等待元素变得可单击,因为您想要单击它)。

一旦定义了wait对象,就可以在不同的条件下一次又一次地重用该wait对象,这样就不必每次都重新初始化它。例如:

WebDriverWait wait = new WebDriverWait(driver, 15, 100);
WebElement myElement = wait.until(ExpectedConditions.elementToBeClickable(By.id("my-id")));
myElement.click();
WebElement anotherElement = wait.until(ExpectedConditions.visibilityOfElementLocated(By.id("another-element")));
//TODO do something with another element

您还可以设置描述等待时间的等待名称:

WebDriverWait fifteenSecondWait = new WebDriverWait(driver, 15, 100);
WebDriverWait fiveSecondWait = new WebDriverWait(driver, 5, 100);

我建议不要在代码中使用隐式wait,而是始终使用显式等待。混合显式和隐式等待可能会产生意外的后果,如果您忘记取消隐式等待,那么当您检查是否存在问题时,您的测试将非常慢。

 类似资料:
  • 我有这样的代码 但之后我尝试在页面上查找元素,WebDriverWait会一直等到页面完全加载,然后开始搜索。如果我尝试这样的事情

  • 我正在创建一个应用程序,它会在打开任何其他应用程序之前询问密码。为了开始我的活动,我创建了一个intent.SETFLAGS(intent.FLAG_ACTIVITY_NEW_TASK)的标志; 锁定/解锁功能正常工作,但当我按下后退按钮时,它没有重定向到主屏幕。

  • 我正在努力使一个向上投票和向下投票的功能在我的网站。然而,有一个我不喜欢的特殊行为,那就是每当用户点击按钮时,他不应该被重定向到另一个页面,而应该保持在同一页面上。 点击upvote按钮后,会转到url,这是我不想要的。我希望它保持在同一页面上,即 models.py views.py urls.py 查看-supplier.html

  • 这是第2页中的代码: 我找不到怎么解决的是,当我点击第1页的选项2时,除了打开第2页,它应该显示给我选择的选项“chiclayo”和这个选项的自我内容;我希望在点击第1页的选项3时发生同样的事情,该选项应该选择“Trujillo”选项并向我显示其内容。我已经尝试了“onclick”事件,但我没有得到结果,我不知道这是正确的方式还是有更好的选择;也许使用javascript或jquery代码。我很感

  • 我是Spring的新手,试图在Spring和primeface之间进行整合。添加和后,在tomcat上运行项目时,我得到404页没有找到。我的web.xml档案: 这是我的faces-config.xml文件: 下面是我的控制器类: 我试图在网上找到解决方案,但我感到困惑,因为大多数示例都使用JSP。请指出问题所在,我正在连接github链接。

  • 我正在用Chrome浏览器测试WebApp。 P.S.:有效,但之后对Webdriver的任何处理都会抛出。我需要在停止其引导后获取页面的当前url。