[Resolved] Как в Selenium WebDriver записать команду clickAT на Java

Как в Selenium WebDriver  записать команду  clickAT на  Java

Например в selenium IDE записана так

clickAt   "xpath=.//*[@id='stations_till']/div[1]",  "2,2"

Как записать эту команду на Selenium WebDriver

ну это будет выглядеть где-то так

 

WebElement baseElement = driver.findElement(By.id("foo"));

Actions clicker = new Actions(driver);

clicker.moveToElement(baseElement).moveByOffset(X, Y).click().perform();

1 лайк

У меня возникла такая же ситуация. Но по примеру с верху, вываливается тест на последней строчке. Что это могло бы значить?

Но по примеру с верху, вываливается тест на последней строчке.

Может быть вываливается exception, а не тест?
Если это так - можете выложить stacktrace?

Трассировка:
org.openqa.selenium.interactions.MoveTargetOutOfBoundsException: Offset within element cannot be scrolled into view: (0, 0): [object HTMLInputElement]
Command duration or timeout: 10 milliseconds
Build info: version: ‘2.44.0’, revision: ‘76d78cf’, time: ‘2014-10-23 20:02:37’
System info: host: ‘TROFIMOVICH’, ip: ‘192.168.255.73’, os.name: ‘Windows 7’, os.arch: ‘amd64’, os.version: ‘6.1’, java.version: ‘1.8.0_31’
Driver info: org.openqa.selenium.firefox.FirefoxDriver
Capabilities [{applicationCacheEnabled=true, rotatable=false, handlesAlerts=true, databaseEnabled=true, version=35.0, platform=WINDOWS, nativeEvents=false, acceptSslCerts=true, webStorageEnabled=true, locationContextEnabled=true, browserName=firefox, takesScreenshot=true, javascriptEnabled=true, cssSelectorsEnabled=true}]
Session ID: 7cb1b7ba-c67a-435d-bf33-6924d1ca790a
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source)
at java.lang.reflect.Constructor.newInstance(Unknown Source)
at org.openqa.selenium.remote.ErrorHandler.createThrowable(ErrorHandler.java:204)
at org.openqa.selenium.remote.ErrorHandler.throwIfResponseFailed(ErrorHandler.java:156)
at org.openqa.selenium.remote.RemoteWebDriver.execute(RemoteWebDriver.java:599)
at org.openqa.selenium.remote.RemoteExecuteMethod.execute(RemoteExecuteMethod.java:34)
at org.openqa.selenium.remote.RemoteMouse.mouseMove(RemoteMouse.java:88)
at org.openqa.selenium.interactions.MoveMouseAction.perform(MoveMouseAction.java:35)
at org.openqa.selenium.interactions.CompositeAction.perform(CompositeAction.java:31)
at org.openqa.selenium.interactions.Actions.perform(Actions.java:367)
at com.example.tests.Anketa.testAnketa1(Anketa.java:47)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:47)
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:44)
at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:26)
at org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:27)
at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:271)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:70)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:50)
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:238)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:63)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:236)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:53)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:229)
at org.junit.runners.ParentRunner.run(ParentRunner.java:309)
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50)
at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:459)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:675)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:382)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:192)
Caused by: org.openqa.selenium.interactions.MoveTargetOutOfBoundsException: Offset within element cannot be scrolled into view: (0, 0): [object HTMLInputElement]
Build info: version: ‘2.44.0’, revision: ‘76d78cf’, time: ‘2014-10-23 20:02:37’
System info: host: ‘TROFIMOVICH’, ip: ‘192.168.255.73’, os.name: ‘Windows 7’, os.arch: ‘amd64’, os.version: ‘6.1’, java.version: ‘1.8.0_31’
Driver info: driver.version: unknown
at .FirefoxDriver.prototype.mouseMoveTo(file:///C:/Users/TRAFIM~1/AppData/Local/Temp/anonymous5469301912976913086webdriver-profile/extensions/fxdriver@googlecode.com/components/driver-component.js:9951:19)
at .DelayedCommand.prototype.executeInternal_/h(file:///C:/Users/TRAFIM~1/AppData/Local/Temp/anonymous5469301912976913086webdriver-profile/extensions/fxdriver@googlecode.com/components/command-processor.js:11635:16)
at .DelayedCommand.prototype.executeInternal_(file:///C:/Users/TRAFIM~1/AppData/Local/Temp/anonymous5469301912976913086webdriver-profile/extensions/fxdriver@googlecode.com/components/command-processor.js:11640:7)
at .DelayedCommand.prototype.execute/<(file:///C:/Users/TRAFIM~1/AppData/Local/Temp/anonymous5469301912976913086webdriver-profile/extensions/fxdriver@googlecode.com/components/command-processor.js:11582:5)

    package com.example.tests;

    import java.util.regex.Pattern;
    import java.util.concurrent.TimeUnit;
    import org.junit.*;    
    import static org.junit.Assert.*;
    import static org.hamcrest.CoreMatchers.*;
    
    import org.openqa.selenium.*;
    import org.openqa.selenium.firefox.FirefoxDriver;
    import org.openqa.selenium.interactions.Actions;
    import org.openqa.selenium.support.ui.Select;
    
    public class Anketa {
      private WebDriver driver;
      private String baseUrl;
      private boolean acceptNextAlert = true;
      private StringBuffer verificationErrors = new StringBuffer();
    
      @Before
      public void setUp() throws Exception {
        driver = new FirefoxDriver();
        baseUrl = "http://scretail-adf:9002";
        driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS);
      }
    
      @Test
      public void testAnketa1() throws Exception {
        driver.get(baseUrl + "/monitor/faces/login.jsf");
        driver.findElement(By.id("form:username")).clear();
        driver.findElement(By.id("form:username")).sendKeys("brsasb");
        driver.findElement(By.id("form:password")).clear();
        driver.findElement(By.id("form:password")).sendKeys("brsasb");
        driver.findElement(By.id("form:loginButton")).click();
        for (int second = 0;; second++) {
        	if (second >= 60) fail("timeout");
        	try { if (isElementPresent(By.id("form:mainMenuButton"))) break; } catch (Exception e) {}
        	Thread.sleep(1000);
        }

        driver.findElement(By.id("form:mainMenuButton")).click();
        WebElement baseElement = driver.findElement(By.id("form:icmTab_0:waitLoadEvent2"));
        Actions clicker = new Actions(driver);
        clicker.moveToElement(baseElement).moveByOffset(15, 69).click().perform();
    }
  }

Посмотрите, у Вас корректно отображается элемент? Не выходит за границы экрана?

И второе- вы обращаетесь именно к тому элементу, который Вам нужен? может быть к какому то родительскому, который просто является вспомогательным для содержания нужного Вам?

Элемент точно этот, а как точнее узнать место расположение элемента? Принцип отображения элемента такой: есть кнопка, при нажатии на нее выпадает меню. Жо нажатия на кнопку дело дошло, а вот в этой менюшке выбрать элемент не получается. Через ide он работает нормально, но там стоит clickat. А тут все пляски с бубном испробовал. Может есть ещё какой-нибудь метод?

По идее должно работать следующее:

  1. нажали на кнопку
  2. подождали пока появится меню
  3. нажали на элемент меню

А можете скинуть следующие куски html: с кнопкой до нажатия, и с кнопкой и меню после нажатия. Поглядим, где у вас может быть проблема.

<!DOCTYPE html>
<html i18n-values="dir:textdirection;" id="uber" class="loading">
<head>
<meta charset="utf-8">
<title i18n-content="pageTitle"></title>
<link id="favicon" rel="icon" type="image/png" sizes="16x16">
<link id="favicon2x" rel="icon" type="image/png" sizes="32x32">

<link rel="stylesheet" href="chrome://resources/css/chrome_shared.css">
<style>/* Copyright (c) 2012 The Chromium Authors. All rights reserved.
 * Use of this source code is governed by a BSD-style license that can be
 * found in the LICENSE file. */

body {
  /* http://crbug.com/129406 --- horizontal scrollbars flicker when changing
   * sections. */
  overflow-x: hidden;
}

#navigation {
  height: 100%;
  left: 0;
  /* This is a hack to prevent the navigation bar from occluding pointer events
   * from the bottom scroll bar (which shows when one needs to horizontally
   * scroll). Corresponding padding-top to offset this is in uber_frame.css */
  margin-top: -20px;
  position: absolute;
  /* This value is different from the left value to compensate for the scroll
   * bar (which is always on and to the right) in RTL. */
  right: 15px;
  width: 155px;
  z-index: 3;
}

#navigation.background {
  z-index: 1;
}

#navigation.changing-content {
  -webkit-transition: -webkit-transform 100ms, width 100ms;
}

.iframe-container {
  -webkit-margin-start: -20px;
  -webkit-transition: margin 100ms, opacity 100ms;
  bottom: 0;
  left: 0;
  opacity: 0;
  position: absolute;
  right: 0;
  top: 0;
  z-index: 1;
}

.iframe-container.selected {
  -webkit-margin-start: 0;
  -webkit-transition: margin 200ms, opacity 200ms;
  -webkit-transition-delay: 100ms;
  opacity: 1;
  z-index: 2;
}

.iframe-container.expanded {
  left: 0;
}

iframe {
  border: none;
  display: block;
  height: 100%;
  width: 100%;
}
</style>

<script src="chrome://resources/js/cr.js"></script>
<script src="chrome://resources/js/cr/ui/focus_manager.js"></script>
<script src="chrome://resources/js/load_time_data.js"></script>
<script src="chrome://resources/js/util.js"></script>

<script src="chrome://chrome/uber.js"></script>
<script src="chrome://chrome/uber_utils.js"></script>
</head>

<body>

<div id="navigation"><iframe src="chrome://uber-frame/" name="chrome"></iframe></div>

<div class="iframe-container"
    i18n-values="id:historyHost; data-url:historyFrameURL;"
    data-favicon="IDR_HISTORY_FAVICON"></div>
<div class="iframe-container"
    i18n-values="id:extensionsHost; data-url:extensionsFrameURL;"
    data-favicon="IDR_EXTENSIONS_FAVICON"></div>
<div class="iframe-container"
    i18n-values="id:settingsHost; data-url:settingsFrameURL;"
    data-favicon="IDR_SETTINGS_FAVICON"></div>
<div class="iframe-container"
    i18n-values="id:helpHost; data-url:helpFrameURL;"
    data-favicon="IDR_PRODUCT_LOGO_16"></div>

<script src="chrome://chrome/strings.js"></script>
<script src="chrome://resources/js/i18n_template2.js"></script>

</body>
</html>

какой-то странный html - без описанных в тестах элементов. Это точно он?

При этом Ваш код натолкнул меня на идею еще одну, которая мне приходила уже в голову. Может быть у Вас меню всплывающее внутри iframe? Хотя, кажется, при этом элемент был бы не найден и ошибка была бы другая.

Это html куков.

вот выкинул отображение меню.

Ну так к сожалению тоже сложно что-либо понять. Такой попап можно отобразить кучей способов и в html коде он может быть представлен во всевозможных вариантах.
Есть подозрение, что у Вас и правда меню в каком-то странном элементе - iframe или чем-то подобном.

А так?

<a id="form:j_idt55:j_idt57:4:subMenuButton" class="contextMenuLink" href="#" style="margin-left: 10px" title="ААААААААААА" onclick="jsf.util.chain(this,event,'icmFrameTabOpen();','mojarra.ab(this,event,\'action\',0,\'form:tabs\')');return false">ААААААААААААААААА</a>

Так.
Это код какой из кнопок? на которую Вы нажимаете или на которую хотите нажать?
Для помощи в решении задачи хотелось бы видеть следующее(еще раз):

  1. кусок html кода с кнопкой, на которую вы нажимаете для открытия меню
  2. кусок html кода с элементами, на которые вы хотите нажать(если возможно - как можно более раскрыто)

Пожалуйста, если не сложно, можете выложить эти 2 куска с обозначениями, что и где? Спасибо.

Из того, что Вы прислали сейчас, очень сложно понять, что это. Если это та кнопка, на которую вы нажимаете - то где ее нажатие в коде тестов? и по коду onClick кажется, что все такие открывается iframe.

1. Кусок html кода с кнопкой, на которую вы нажимаете для открытия меню:

<div class="icmTab" style="width:24px; float: left; border-width: 1px 1px 1px 1px;">
<table style="width: 100%; height: 100%; border-collapse: collapse;">
<tbody>
<tr style="width: 100%; height: 100%">
<td style="width: 100%; height: 100%; text-align: center; vertical-align: middle;">
<img id="form:mainMenuButton" src="/monitor/images/new.png" alt="" style="cursor: pointer;" title="Главное меню">
<img id="form:pleaseWait" src="/monitor/images/twait.gif" alt="" style="display: none;" title="Пожалуйста, подождите...">
</td>
</tr>
</tbody>
</table>
</div>

2. кусок html кода с элементами, на которые вы хотите нажать(если возможно - как можно более раскрыто)

<div id="form:j_idt55:controls_jsfContextMenu_body" class="contextMenu " style="left: 15px; top: 71px; z-index: 10000; display: block;">
<input id="form:j_idt55:j_idt49:0:controls_jsfContextMenu_event" type="submit" name="form:j_idt55:j_idt49:0:controls_jsfContextMenu_event" value="" style="display: none" onclick="mojarra.ab(this,event,'action',0,0);return false">
...
<br>
<a id="form:j_idt55:j_idt57:4:subMenuButton" class="contextMenuLink" href="#" style="margin-left: 10px" title="Договора" onclick="jsf.util.chain(this,event,'icmFrameTabOpen();','mojarra.ab(this,event,\'action\',0,\'form:tabs\')');return false">Договора</a>
<br>
...

Клик по элементу form:mainManuButton у Вас проходит как Вы писали.

Не очень понятно, как у Вас не выкидывается ошибка в этом месте:

Так как среди приложенного кода с элементами - такого элемента нету. Или я ошибаюсь?
При этом в изначальном сообщении вообще какой-то другой xpath. Немного запутанно.

То есть по идее, если я правильно понял код html, то следующее должно работать:

driver.findElement(By.id("form:mainManuButton")).click();
driver.findElement(By.cssSelector("a[title='Договора']")).click();

Попробовал во так:

WebElement baseElement = driver.findElement(By.id("form:j_idt55:j_idt57:4:subMenuButton"));
   Actions clicker = new Actions(driver);
   clicker.moveToElement(baseElement).moveByOffset(14, 200).click().perform();

Как тебе сказать, действие нажатие прошло но действия открытия новой страницы не произошло.
Твой код тоже также работает.

ошибка сейчас вот такая с трейсов:
org.openqa.selenium.NoSuchElementException: Unable to locate element: {“method”:“id”,“selector”:“s1:it2::content”}
Command duration or timeout: 30.05 seconds
For documentation on this error, please visit: Selenium
Build info: version: ‘2.44.0’, revision: ‘76d78cf’, time: ‘2014-10-23 20:02:37’
System info: host: ‘TROFIMOVICH’, ip: ‘192.168.255.73’, os.name: ‘Windows 7’, os.arch: ‘amd64’, os.version: ‘6.1’, java.version: ‘1.8.0_31’
Driver info: org.openqa.selenium.firefox.FirefoxDriver
Capabilities [{applicationCacheEnabled=true, rotatable=false, handlesAlerts=true, databaseEnabled=true, version=35.0, platform=WINDOWS, nativeEvents=false, acceptSslCerts=true, webStorageEnabled=true, locationContextEnabled=true, browserName=firefox, takesScreenshot=true, javascriptEnabled=true, cssSelectorsEnabled=true}]
Session ID: 3a2d3dae-60a7-45b9-aefa-1b180d069f2a
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source)
at java.lang.reflect.Constructor.newInstance(Unknown Source)
at org.openqa.selenium.remote.ErrorHandler.createThrowable(ErrorHandler.java:204)
at org.openqa.selenium.remote.ErrorHandler.throwIfResponseFailed(ErrorHandler.java:156)
at org.openqa.selenium.remote.RemoteWebDriver.execute(RemoteWebDriver.java:599)
at org.openqa.selenium.remote.RemoteWebDriver.findElement(RemoteWebDriver.java:352)
at org.openqa.selenium.remote.RemoteWebDriver.findElementById(RemoteWebDriver.java:393)
at org.openqa.selenium.By$ById.findElement(By.java:214)
at org.openqa.selenium.remote.RemoteWebDriver.findElement(RemoteWebDriver.java:344)
at com.example.tests.Anketa.testAnketa1(Anketa.java:67)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:47)
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:44)
at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:26)
at org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:27)
at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:271)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:70)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:50)
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:238)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:63)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:236)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:53)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:229)
at org.junit.runners.ParentRunner.run(ParentRunner.java:309)
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50)
at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:459)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:675)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:382)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:192)
Caused by: org.openqa.selenium.NoSuchElementException: Unable to locate element: {“method”:“id”,“selector”:“s1:it2::content”}
For documentation on this error, please visit: Selenium
Build info: version: ‘2.44.0’, revision: ‘76d78cf’, time: ‘2014-10-23 20:02:37’
System info: host: ‘TROFIMOVICH’, ip: ‘192.168.255.73’, os.name: ‘Windows 7’, os.arch: ‘amd64’, os.version: ‘6.1’, java.version: ‘1.8.0_31’
Driver info: driver.version: unknown
at .FirefoxDriver.prototype.findElementInternal_(file:///C:/Users/TRAFIM~1/AppData/Local/Temp/anonymous1208207135295241646webdriver-profile/extensions/fxdriver@googlecode.com/components/driver-component.js:9641:26)
at .fxdriver.Timer.prototype.setTimeout/<.notify(file:///C:/Users/TRAFIM~1/AppData/Local/Temp/anonymous1208207135295241646webdriver-profile/extensions/fxdriver@googlecode.com/components/driver-component.js:548:5)