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

Java selenium驱动程序单击项目,然后重定向到新页面,并尝试查找上一页面的相同项目,java,selenium,selenium-webdriver,webdriver,automated-tests,Java,Selenium,Selenium Webdriver,Webdriver,Automated Tests,检查用于等待SeleniumWebDriver中元素的方法的代码 我这样称呼它 waitForElement(By.id(idOfElement)) 这个方法应该找到元素并单击它 它工作得很好,本来应该单击元素然后从方法返回,但现在失败了,因为驱动程序单击了重定向到另一个页面的元素,在新页面显示驱动程序而不是从方法返回后,它进入catch异常,最后代码失败了,因为驱动程序试图找到其中的元素上一页 修复此方法有什么帮助吗 更新:第一次单击后返回 如果找到了元素,那么它应该退出方法。这里的问题是,有

检查用于等待SeleniumWebDriver中元素的方法的代码 我这样称呼它 waitForElement(By.id(idOfElement))

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

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

修复此方法有什么帮助吗

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

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

  • 新窗口:
  • 新选项卡:

    • 那种方法太可怕了。您有很多不需要的代码,一个不需要的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秒,直到条件变为真。每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,而是始终使用显式等待。混合显式和隐式等待可能会产生意外的后果,如果您忘记取消隐式等待,那么当您检查是否存在问题时,您的测试将非常慢

      如果元素不存在,它将始终失败。这里的问题是,它找到元素并单击它,然后我被重定向到一个新页面,驱动程序尝试查找在上一页中单击的元素,如果元素不存在,我希望该方法失败,因为我在另一个测试中的快乐测试场景中调用了此方法如果未找到元素,则测试应失败的场景第二次单击不在捕获中,它位于for循环之外,因此将始终进行处理。存在返回;第一次单击后,如果找到了,则应返回以退出方法单击元素将导致重定向到位于同一窗口和同一选项卡中的页面尝试了所有操作显式等待、隐式等待或pageLoadTimeout每个操作都会导致异常“接收来自渲染器的消息超时”我创建这个方法是因为有一个例外,上面的显式等待代码将执行您试图正确执行的操作。“从渲染器接收消息超时”听起来像是一个旧的chromedriver bug()。检查您是否正在使用最新版本的chromedriver,并尝试从代码中删除所有隐式等待。我正在使用最新版本,并尝试了您提供的显式等待,但由于该例外,该等待无法正常工作。您是否尝试从代码中删除所有隐式等待,并将浏览器登录设置为关闭?是的,我已删除你是说历史?通过将浏览器登录设置为关闭??
      WebDriverWait fifteenSecondWait = new WebDriverWait(driver, 15, 100);
      WebDriverWait fiveSecondWait = new WebDriverWait(driver, 5, 100);