selenium 中的 ime() 到底是做啥的?

Posted

技术标签:

【中文标题】selenium 中的 ime() 到底是做啥的?【英文标题】:What exactly does ime() in selenium do?selenium 中的 ime() 到底是做什么的? 【发布时间】:2014-12-22 16:24:17 【问题描述】:
driverInstanceName.manage().ime().getActiveEngine()
driverInstanceName.manage().ime().activateEngine(engine)

得到如下异常,

org.openqa.selenium.WebDriverException: 
unimplemented command: session/3f83e50445b7c179249aada785c8e910/ime/activate
Command duration or timeout: 2 milliseconds

了解它与输入数据有关,但不确定它与 selenium 的相关性,尝试在许多论坛中找到答案但无济于事。

【问题讨论】:

【参考方案1】:

在阅读了这个问题并围绕这个问题进行了谷歌搜索后,有兴趣了解更多关于 ime() 方法的信息:

IME - 代表输入法引擎。目前好像只有 Linux 平台和 Firefox 浏览器支持。

在linux中处理需要通过Selenium输入的中文/日文或多字节字符时,您必须使用IBus这样的输入框架和在IBus上实现的引擎,如anthy(日文),pinyin (中文)。

以下代码示例取自 Selenium 的 I18NTest.java,它寻找 anthy 引擎在 linux 机器上输入日文字符。

  @NeedsFreshDriver
  @Ignore(value = IE, CHROME, FIREFOX,
          reason = "Not implemented on anything other than Firefox/Linux at the moment.")
  @NotYetImplemented(htmlUNIT)
  @Test
  public void testShouldBeAbleToActivateIMEEngine() throws InterruptedException 
    assumeTrue("IME is supported on Linux only.",
               TestUtilities.getEffectivePlatform().is(Platform.LINUX));

    driver.get(pages.formPage);

    WebElement input = driver.findElement(By.id("working"));

    // Activate IME. By default, this keycode activates IBus input for Japanese.
    WebDriver.ImeHandler ime = driver.manage().ime();

    List<String> engines = ime.getAvailableEngines();
    String desiredEngine = "anthy";

    if (!engines.contains(desiredEngine)) 
      System.out.println("Desired engine " + desiredEngine + " not available, skipping test.");
      return;
    

    ime.activateEngine(desiredEngine);

    int totalWaits = 0;
    while (!ime.isActivated() && (totalWaits < 10)) 
      Thread.sleep(500);
      totalWaits++;
    
    assertTrue("IME Engine should be activated.", ime.isActivated());
    assertEquals(desiredEngine, ime.getActiveEngine());

    // Send the Romaji for "Tokyo". The space at the end instructs the IME to convert the word.
    input.sendKeys("toukyou ");
    input.sendKeys(Keys.ENTER);

    String elementValue = input.getAttribute("value");

    ime.deactivate();
    assertFalse("IME engine should be off.", ime.isActivated());

    // IME is not present. Don't fail because of that. But it should have the Romaji value
    // instead.
    assertTrue("The elemnt's value should either remain in Romaji or be converted properly."
        + " It was:" + elementValue, elementValue.equals(tokyo));
  

警告:我的回答可能对ime() 给出了一个公平的想法,selenium 提交者可以改进更多见解,因为我看到此功能不在广泛使用,但支持有限(仅在 Linux 中)。

【讨论】:

它实际上代表输入法引擎——参见seleniumhq.github.io/selenium/docs/api/java/org/openqa/selenium/… 一个通用接口,用于处理用户输入(例如通过键盘、鼠标或其他输入,如触摸屏上的软键盘、游戏控制器等) IME 是输入法编辑器而不是引擎....有关 IME 的详细信息,请访问w3.org/TR/ime-api fijiaaron, pooja - 在帖子中更正了 IME 定义。

以上是关于selenium 中的 ime() 到底是做啥的?的主要内容,如果未能解决你的问题,请参考以下文章

python中的KFold到底是做啥的?

pcap 中的 ntohs() 到底是做啥的?

张量流中的“tf.contrib.rnn.DropoutWrapper”到底是做啥的? (三题)

Perl 的“祝福”到底是做啥的?

“npm audit fix”到底是做啥的?

C 结构点运算符到底是做啥的(低级视角)?