【问题标题】:Correct way to focus an element in Selenium WebDriver using Java使用 Java 在 Selenium WebDriver 中聚焦元素的正确方法
【发布时间】:2012-07-05 02:57:25
【问题描述】:

对于 WebDriver,selenium.focus() 的等价物是什么?

element.sendKeys("");

new Actions(driver).moveToElement(element).perform();

我已经尝试了这两种方法并且它们都有效,但是哪一种总是适用于所有元素?

对于任何元素(如按钮、链接等),哪一种方式是正确的?这对我很重要,因为该函数将用于不同的 UI。

【问题讨论】:

    标签: java focus selenium-webdriver setfocus


    【解决方案1】:

    以下代码 -

    element.sendKeys("");

    试图找到一个输入标签框来输入一些信息,而

    new Actions(driver).moveToElement(element).perform();

    更适合用于图像元素、链接元素、下拉框等。

    因此,使用 moveToElement() 方法更有意义地关注网页上的任何通用 WebElement。

    对于输入框,您必须在要聚焦的元素上click()

    new Actions(driver).moveToElement(element).click().perform();

    虽然对于链接和图像,鼠标将悬停在特定元素上,但您可以根据自己的需要决定对其进行 click()。

    如果输入标签上的 click() 不起作用 -

    既然你希望这个函数是通用的,你首先检查webElement是否是一个输入标签——

    if("input".equals(element.getTagName()){
       element.sendKeys("");
    } 
    else{
       new Actions(driver).moveToElement(element).perform();
    
    }
    

    您可以根据自己的喜好进行类似的更改。

    【讨论】:

    • @questions "element.sendKeys(""); 试图找到一个输入标签框来输入一些信息" ... 这句话绝对不是真的sendKeys() 获得元素的焦点(此外,如果该元素是 input,它会将光标带到已经存在的文本的末尾),然后在元素上按下键(或模拟)。我认为这两种方法都应该有效,moveToElement() 可以说更干净、更易读,但sendKeys() 也不会让你失望。
    • 如何验证文本字段上是否存在焦点/光标?
    • 对于C#,上面的代码可以这样写: if ("input" == (element.TagName)) { element.SendKeys(""); } else { new Actions(Driver).MoveToElement(element).Perform(); } // 其中 Driver == new ChromeDriver() ||新的 FirefoxDriver() ||等
    • Safari does not support moveToElement,但确实支持 element.sendKeys()。这是使用 element.sendKeys() 的一个很好的论据 - 如果您想针对 Safari 进行测试。
    • 我最初使用 sendKeys 是因为它更简单,但我发现当输入使用自定义 javascript 下拉菜单时,它会在 Firefox 中导致意外行为。不过 moveToElement 方法确实有效。
    【解决方案2】:

    你可以使用JS如下:

    WebDriver driver = new FirefoxDriver();
    JavascriptExecutor jse = (JavascriptExecutor) driver;
    jse.executeScript("document.getElementById('elementid').focus();");
    

    【讨论】:

      【解决方案3】:

      这段代码实际上并没有提供焦点:

      new Actions(driver).moveToElement(element).perform();
      

      它提供了悬停效果。

      此外,JS 代码 .focus() 要求窗口处于活动状态才能工作。

      js.executeScript("element.focus();");
      

      我发现这段代码有效:

      element.sendKeys(Keys.SHIFT);
      

      对于我自己的代码,我同时使用:

      element.sendKeys(Keys.SHIFT);
      js.executeScript("element.focus();");
      

      【讨论】:

      • 它提供悬停或将窗口移动(或滚动)到元素?
      【解决方案4】:

      只有在窗口获得焦点时焦点才有效。

      请务必使用((JavascriptExecutor)webDriver).executeScript("window.focus();");

      【讨论】:

        【解决方案5】:

        FWIW,我遇到了我认为相关的问题并想出了一个解决方法:我编写了一个 Chrome 扩展程序,将 document.execCommand('paste') 放入一个文本区域,重点是窗口卸载,以便填充具有系统剪贴板内容的元素。这在 100% 的时间内手动工作,但在 Selenium 下运行时 execCommand 几乎一直返回 false。

        我在最初的 driver.get(myChromeExtensionURL) 之后添加了一个 driver.refresh(),现在它 100% 的时间都在工作。这是在 Mac OS 10.9 上使用 Selenium 驱动程序版本 2.16.333243 和 Chrome 版本 43。

        当我研究这个问题时,我没有看到任何关于这个解决方法的提及,所以我想我会记录下我的发现,以供那些跟随我的 Selenium/focus/execCommand('paste') 脚步的人使用。

        【讨论】:

          【解决方案6】:

          C#扩展方法代码,焦点元素,输入文字,调用change()。

          public static void EnterText(this IWebDriver driver, IWebElement element, string textToEnter)
              {
                  var js = (IJavaScriptExecutor)driver;
                  js.ExecuteScript("arguments[0].focus();", element);
                  js.ExecuteScript("arguments[0].setAttribute('value', arguments[1])", element, textToEnter);
                  js.ExecuteScript("$(arguments[0]).change();", element);
              }
          

          调用者:

          driver.EnterText(element, text);
          

          【讨论】:

            【解决方案7】:

            我们也可以使用下面的代码来关注 webelement:

            public focusElement(WebElement element){
                String javaScript = "var evObj = document.createEvent('MouseEvents');"
                                + "evObj.initMouseEvent(\"mouseover\",true, false, window, 0, 0, 0, 0, 0, false, false, false, false, 0, null);"
                                + "arguments[0].dispatchEvent(evObj);";
            
                        ((JavascriptExecutor) getDriver()).executeScript(javaScript, element);
            }
            

            希望对你有帮助:)

            【讨论】:

              猜你喜欢
              • 2021-09-11
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2019-08-26
              • 1970-01-01
              相关资源
              最近更新 更多