【问题标题】:Selenium webdriver can't click on a link outside the pageSelenium webdriver 无法点击页面外的链接
【发布时间】:2012-08-15 15:03:45
【问题描述】:

我遇到了 Selenium WebDriver 的问题。我尝试单击窗口页面外的链接(您需要向上滚动才能看到它)。我当前的代码是相当标准的:

menuItem = driver.findElement(By.id("MTP"));
menuItem.click();
// I also tried menuItem.sendKeys(Keys.RETURN);

我知道我可以向上滚动,在这种情况下它会起作用。但是,如果您有一长串项目,您不一定知道必须向下滚动多远。

有没有什么方法可以点击页面可见部分不存在的链接(但如果滚动则可见)?

附带说明一下,我使用的是 Firefox,但我也打算使用 IE7/8/9 和 Chrome。

任何帮助将不胜感激。

编辑:恐怕不能给出源代码,因为我工作的公司不允许,但我可以给出我想点击的链接的代码:

<div class="submenu">
  <div id="MTP">Link title</div>
</div>

完全相同的代码在链接可见时有效,只有在链接不可见时才有效。

Edit2:实际上,奇怪的是,它没有引发任何异常,只是转到下一条指令。所以基本上,会发生什么:

menuItem = driver.findElement(By.id("MTP")); // no exception
menuItem.click();  // no exception
//... some code ensuring we got to the next page: timeout reached
driver.findElement(By.id("smLH")).click(); // NoSuchElementException, as we're on the wrong page.

【问题讨论】:

  • 您使用的是什么版本的 webdriver?我知道这在早期版本中是一个问题,但后来得到了解决。如果不是,请尝试使用 2.25。
  • 还需要滚动浏览器的滚动条还是页面列表的自定义滚动条?
  • 我已经在使用 2.25 版了。至于滚动条,页面中只有浏览器的滚动。但理想情况下,我不想使用任何滚动条。
  • 能否提供一些被测网页的源代码?
  • 您遇到异常了吗?可以发一下吗?

标签: java selenium scroll click webdriver


【解决方案1】:

实际上可以自动滚动到元素。虽然在这种情况下这不是一个好的解决方案(必须有一种方法可以让它在不滚动的情况下工作),但我会将它作为一种解决方法发布。我希望有人会想出更好的主意...

public void scrollAndClick(By by)
{
   WebElement element = driver.findElement(by);
   int elementPosition = element.getLocation().getY();
   String js = String.format("window.scroll(0, %s)", elementPosition);
   ((JavascriptExecutor)driver).executeScript(js);
   element.click();
}

【讨论】:

    【解决方案2】:

    我在another question 中发布了相同的答案,所以这只是复制和粘贴。

    我曾经有一个组合框,我认为不需要扩展。我所做的是使用 Actions 构建器,因为 moveToElement() 函数会自动将对象滚动到视图中。然后就可以点击了。

    WebElement element = panel.findElement(By.className("tabComboBoxButton"));
    
    Actions builder = new Actions(this.driver);
    
    builder.moveToElement(element);
    builder.click();
    builder.build().perform();
    

    (面板只是我 POM 中的一个包装元素)

    【讨论】:

    • 工作就像一个魅力! (尽管在 C# 中,所有方法都是大写的)
    • @Bill,该链接返回到同一个问题。我想看看你要链接到的问题。你能用正确的链接更新吗?
    【解决方案3】:

    我没有将滚动条移动到按钮位置,有时它对我不起作用,而是将输入键发送到按钮

    var element = driver.FindElement(By.Id("button"));
    element.SendKeys(Keys.Enter);
    

    【讨论】:

    • 大量痛苦的答案,当这对许多情况来说已经足够了......好电话。
    • 我认为真正的问题是 webdriver 无法找到按钮。
    【解决方案4】:

    最近,当 JS 对话框中有一个可选对象列表时,我遇到了类似的问题。有时 selenium 不会在列表中选择正确的对象。所以我找到了这个 javascript 建议:

    WebElement target = driver.findElement(By.id("myId"));
    ((JavascriptExecutor) driver).executeScript("arguments[0].scrollIntoView(true);", target);
    Thread.sleep(500); //not sure why the sleep was needed, but it was needed or it wouldnt work :(
    target.click();
    

    这解决了我的问题

    【讨论】:

      【解决方案5】:

      嘿,你可以将它用于红宝石

      variable.element.location_once_scrolled_into_view
      

      将要查找的元素存储在变量中

      【讨论】:

        【解决方案6】:

        这可能是因为您的页眉元素或页脚元素可能会阻挡您想要对其执行操作的元素的视图。当必须对元素执行某些操作时,Selenium 会尝试滚动到元素位置(我使用的是 Selenium WebDriver v3.4.0)。

        这是一个解决方法 -

        private WebElement scrollToElementByOffset(WebElement element, int offset) {
            JavascriptExecutor jse = (JavascriptExecutor) driver;
            jse.executeScript("window.scrollTo(" + element.getLocation().getX() + "," + (element.getLocation().getY()
                    + offset) + ");");
        
            return element;
        }
        

        上述函数将视图滚动到元素,然后按您提供的偏移量进一步滚动。您可以通过执行以下操作来调用此方法 -

        WebElement webElement = driver.findElement(By.id("element1"));
        scrollToElementByOffset(webElement, -200).click();
        

        现在,这只是一种解决方法。我很高兴欢迎更好的解决方案来解决这个问题。

        【讨论】:

          【解决方案7】:

          这个解决方案对我来说就像一个魅力:

          public void click(By by) throws Exception{
              WebElement element = driver.findElement(by);
              ((JavascriptExecutor) driver).executeScript("arguments[0].scrollIntoView(true);", element);
              Thread.sleep(500);
              element.click();
          }
          

          【讨论】:

            【解决方案8】:

            这对我有用(在 c# 中)-

            item = driver.findelement(by.....);
            item.SendKeys(Keys.LeftControl);
            item.Click();
            

            【讨论】:

              【解决方案9】:

              只是一个补充: 在我的情况下,该按钮被另一个浮动按钮重叠。

              只需调整浏览器窗口大小即可解决问题!

              【讨论】:

              • 如何在不调整浏览器窗口大小的情况下解决问题?
              • 说实话,这已经是很久以前的事了。我想到了什么,但这只是一个需要有人验证的猜测:如果按钮首先在 3D 层次结构(z-index 属性)中使用 javascript 向上移动到顶部怎么办?只是一个想法。不知道有没有用。
              【解决方案10】:

              我使用以下方法解决了 Selenium Java 的类似问题:

              public static void scrollToElementByElement(WebElement element) {
              
                  Coordinates coordinates = ((Locatable)element).getCoordinates();
                  coordinates.inViewPort();
                  coordinates.click(); //if needed
              
              }
              

              然后在我的主测试类上调用方法

              【讨论】:

                【解决方案11】:

                我使用了以下方法来解决可见区域中不存在元素的问题。代码向下滚动网页,直到可以对元素执行 selenium 操作。根据需要改变Y轴坐标和i的值。

                public void scrooling(By ele) throws InterruptedException {
                        for (int i = 0; i < 10; i++) {
                            try {
                                driver.findElement(ele);
                                break;
                            } catch (ElementNotVisibleException e) {
                                JavascriptExecutor js = (JavascriptExecutor) driver;
                                js.executeScript("window.scrollBy(0,400)");
                                System.out.println("inside ElementNotVisibleException block");
                                Thread.sleep(3000);
                            } catch (NoSuchElementException e) {
                                JavascriptExecutor js = (JavascriptExecutor) driver;
                                js.executeScript("window.scrollBy(0,400)");
                                System.out.println("inside NoSuchElementException block");
                                Thread.sleep(3000);
                            }
                
                        }
                
                
                    } 
                

                【讨论】:

                  猜你喜欢
                  • 1970-01-01
                  • 1970-01-01
                  • 2017-03-19
                  • 2013-02-06
                  • 2016-09-29
                  • 1970-01-01
                  • 2019-10-17
                  • 2018-05-01
                  相关资源
                  最近更新 更多