Перейти к содержимому

Фотография

Не срабатывает клик


  • Авторизуйтесь для ответа в теме
Сообщений в теме: 14

#1 Salomon

Salomon

    Новый участник

  • Members
  • Pip
  • 8 сообщений

Отправлено 03 июля 2012 - 13:33

Добрый день!

Я недавно начал изучать Selenium WebDriver, так что возникает множество вопросов. Суть такова: есть пробный код к порталу, который я тестирую:


        driver.findElement(By.linkText("link")).click();
        driver.switchTo().frame("mainframe");
        WebElement element3 = driver.findElement(By.name("login"));   
        WebElement element4 = driver.findElement(By.name("password"));
        element3.sendKeys("log");
        element4.sendKeys("pass");
        element4.submit();
        
        
        driver.switchTo().defaultContent();
        driver.switchTo().frame(1);
        
        JavascriptExecutor js = (JavascriptExecutor) driver;
        
       [b] js.executeScript("return document.getElementById('MENU_TYPE').click()");[/b]
        Thread.sleep(10000);
        
        [b]js.executeScript("return document.getElementById('x-auto-21').click()");[/b]
        Thread.sleep(5000);
        
         
       [u] driver.findElement(By.xpath("//div[@id='x-auto-24__x-auto-24_x-auto-456']")).click();[/u] 
       
        Thread.sleep(10000);

Нужно тестировать только в ИЕ. Js код пришлось добавлять потому, что в ие просто не срабатывал метод click(). А вот что касается последней выделенной строки, её я не могу кликнуть даже с помощью js. При клике на"//div[@id='x-auto-24__x-auto-24_x-auto-456']")).click() див должен подсветиться. Причём в мозиле всё нормально работает, даже без js. Подскажите новичку, а то уже вторые сутки не могу сдвинуться.
  • 0

#2 Salomon

Salomon

    Новый участник

  • Members
  • Pip
  • 8 сообщений

Отправлено 04 июля 2012 - 12:28

Как оказалось клик в ИЕ бъёт почему то выше нужного мне дива. Вот как с этим борются буржуи
  • 0

#3 testopatolog

testopatolog

    Новый участник

  • Members
  • Pip
  • 29 сообщений
  • ФИО:Aprobator

Отправлено 06 июля 2012 - 20:59

:.с этим борются.:

1) В том примере умные буржуи показали, ЧТО (какой HTML-код) и КАК автоматизировать (корректный webdriver-скрипт).
Вы сами-то поняли свой "недостаток" в формулировке вопроса?.. Надо правильно/полно формулировать проблему,(а Вы не показали ни html-sorce, ни автоматизируемый url-ресурс, который судя по внушительным thread.sleep - внешний)!
2) Обнадёживает "Ваш почерк" webdriver-скрипта (здесь у Вас не ботва Firefox SeleniumIDE) - вы двигаетесь в правильном направлении, но вам нужен учитель, иначе - потеряете время или разочаруетесь в автоматизации.
  • 0

#4 Salomon

Salomon

    Новый участник

  • Members
  • Pip
  • 8 сообщений

Отправлено 09 июля 2012 - 05:22

Чего, я всё правильно написал Борются - глагол на (-оть -бороться) - 1 спряжение.В 3 лице мн.ч. окончание -ют.)))
А по теме. Тяжело, только устроился на работу, все тестируют вручную, и того кто бы помог разобраться нет. Так что надеюсь на свои силы и на форум))
  • 0

#5 neman

neman

    Активный участник

  • Members
  • PipPip
  • 142 сообщений
  • ФИО:Антон


Отправлено 09 июля 2012 - 06:40

По ссылке, кстати, один умный вещь сказан - масштаб надо в 100% выставить. Сам однажды на эти грабли наступил.
  • 0

#6 Salomon

Salomon

    Новый участник

  • Members
  • Pip
  • 8 сообщений

Отправлено 09 июля 2012 - 09:43

Я пробовал, измение масштаба не помогает.
  • 0

#7 testopatolog

testopatolog

    Новый участник

  • Members
  • Pip
  • 29 сообщений
  • ФИО:Aprobator

Отправлено 09 июля 2012 - 22:02

Какой-то неизлечимый случай - вроде вы сказали, что нашли способ решить проблему, а с другой стороны товарищи с форума всё ещё с этим борются, даже не зная html-исходника, с которым связана проблема, а ваша реакция неоднозначна.
Чтобы разобраться с ситуацией, Salomon, уточните: вы уже решили свой вопрос?
A) Если нет - предоставьте "объект" автоматизации, иначе вы инициируете непродуктивную активность (вам это надо?);
B) Если да - спасибо вам за интересный вопрос, и пожалуйста, закройте его однозначной мыслью о найденном варианте решения.
  • 0

#8 Salomon

Salomon

    Новый участник

  • Members
  • Pip
  • 8 сообщений

Отправлено 10 июля 2012 - 07:39

Нет вопрос я не решил. Вернее решил но очень криво и я надеюсь такое решение временное. HTML код выложить никак не могу в силу обстоятельств. Я говорил с программистами, которые писали это прилржение, они качают головой и говорят что что всё это связанно с gwt и будет достаточно проблемнно автоматизировать этот тест.
В общих чертах, я просто кликаю по диву, внутри которого содержаться нужные мне дочерние дивы. Затем методом sendKeys поднимаюсь до нужного мне дива и уже работаю с ним. Решение мягко говоря - типа костыль, но пока ничего лучше я не нашёл. Поробую работать с координатами, может получится найти какую то последовательность. Причём в Огненой Лисе и Хроме всё работает, все клики проходят, но ИЕ шлёт привет. Буду искать решение дальше, так что тема открыта, кто справился расскажите как)
  • 0

#9 testopatolog

testopatolog

    Новый участник

  • Members
  • Pip
  • 29 сообщений
  • ФИО:Aprobator

Отправлено 10 июля 2012 - 20:48

:.див должен подсветиться.:.уже вторые сутки не могу сдвинуться.:

Обычно требуется сценарий автоматизации подвести к "точке входа" в содержательную часть проверок.
Подсветка дива - самое осмысленное, ключевое событие регрессии?
Если нет - эту тестонепригодную стадию нужно "обойти". Более того, стратегия тестирования должна строиться на "прыжках" через "шелуху".
С другой стороны, педантизм - хорошее качество тестировщика, и мне нравится, что вы не приемлете кривые решения.

Прошла неделя, в сложившейся сложной ситуации неопределённости, предполагая, что див это не кнопка, можно на 50% утверждать, что ваш div.click - это попытка перевести на него фокус. Если это так, то рассматривали ли вы как вариант, такую конструкцию:
new Actions(driver).moveToElement(element).perform()
  • 0

#10 Salomon

Salomon

    Новый участник

  • Members
  • Pip
  • 8 сообщений

Отправлено 11 июля 2012 - 07:55

В первую очередь спасибо Вам за оветы!

Да я пробовал new Actions(driver).moveToElement(element).perform() . Увы не работает. Но моему удивлению не было предела когда с делал следующее. Для наглядности вот примерная иерархия нужно мне дива.

<div id='anotherDiv'></div>

<div id='main'>
<div id='child1'>smth</div>
<div id='child2>smthnew</div>
<div id='child3>smthelse</div>
..........
<div id='child8>smthelse</div>
..........
</div>

Так вот. При выполнении driver.findElement(By.id("main")).getLocation() и driver.findElement(By.id("child1")).getLocation(), я получаю одинаковае координаты. И при этом driver.findElement(By.id("main")).click() клик проходится на child8, а driver.findElement(By.id("child1")).click() попадает в anotherDiv. То же самое происходит и в Actions. Плюс это GWT там в каждом диве по сто спанов таблиц и так далее. Иногда id меняются.
Может я не прав, но для Selenium'a GWT это зло. Но с ним точно надо бороться)
  • 0

#11 testopatolog

testopatolog

    Новый участник

  • Members
  • Pip
  • 29 сообщений
  • ФИО:Aprobator

Отправлено 11 июля 2012 - 20:33

зvо - это недостаток знаний и миражи целей, его не выбираешь, но, не сдаваясь, а опираясь на него, обретаешь опыт.
GWT (ZK) - это ни зvо ни добrо - это надёжный кросс-фреймворк, (страшно тормозящий в IE - теперь я понял из-за чего у вас такие большие thread.sleep).

Далее речь пойдёт о web-роботе, т.е. что надо для того, чтобы сдвинуться в правильном направлении и в хорошем смысле.

1. Разберитесь с целью автоматизации тестирования применительно к вашему приложению.

2. Вы убедились, что коммерческие продукты - это не тестовые "болванки", самплами автоматизации которых вам обещают добrо? Уверяю вас, что кроме gwt есть ещё другие чудесные фреймворки, помноженные на грабли девелоперов и возведённые в степень кривизны environment.

3. Автоматизация... здесь надо мнооогое знать, кроме webdriver api... чтобы всё эффективно работало, важно чтобы ещё и девелоперы ею проникнулись.

Совет 1: откажитесь от координат - это зvо, добrо - это автоматизация на основе экземпляров объектов.
Совет 2: выясните, интересно ли вашим девелоперам то, что вы хотите автоматизировать?
Совет 3: может, проверяя web-приложение, вам не надо делать акцент на дизайне и событийной модели в рамках Internet Explorer, а обратить внимание на функциональность и информационное наполнение в Google Chrome или Firefox?
  • 0

#12 testopatolog

testopatolog

    Новый участник

  • Members
  • Pip
  • 29 сообщений
  • ФИО:Aprobator

Отправлено 18 июля 2012 - 21:41

.:я не решил. Вернее решил.:.удивлению не было предела.:.там в каждом диве по сто спанов таблиц и так далее. Иногда id меняются:.


1) Salomon, мне непонятно, почему, когда человек просит помощи, он в конце концов утаивает своё решение, (размазывая его в общих чертах, типа оно кривоватое, не стоит обсуждения)?!

2) Вашему и общему вниманию я предлагаю своё решение: пример (html-исходник) и java-автоматизация для Internet Explorer или Firefox, цель которой - инициировать обработчики клика/фокусировки для DIV, меняющие их css.

Используется:
- selenium-server-standalone-2.24.1.jar;
- успешно запускается (default browser configuration properties) в IE v.8 или FF esr v.10 на XP.

Внимание: я предлагаю минимально использовать любые функции webdriver API, т.е. строить код автоматизации сценария на основе метода executeScript, (чтобы избежать граблей и глюков этой "замечательной кроссбраузерной" библиотеки, - это я намекаю, что ни qwt ни iexplorer "не виноваты" в кривых руках как api-разработчиков так и автоматизаторов). Данная техника иллюстрируется в примере, и, её специфика состоит в связывании с DIV-объектами событий и их обработчиков в соответствии с особенностями jscript в IE и FF.

Замечание (для sorce-критиков): java-код не претендует на звание "идеальный", это всего лишь как надо работающий пример. В jscript используются id для работы с html-объектами, что сделано для простоты, т.к. практически не существует проблем идентификации объекта посредством dom, хpath или методами jscript-фреймворков, используемых в современных web-приложениях.

----------------------------------------------
<!doctype html public "-//w3c//dtd html 4.01//en" "http://www.w3.org/tr...l4/strict.dtd">
<html>
<header>
<title>test</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache, no-store, must-revalidate">
<meta http-equiv="expires" content="mon, 26 jul 1997 05:00:00 gmt">
<style type="text/css">
.block1{width:500px;background:#D3D3D3;padding:5px;padding-right:20px;border:solid 1px black;float:left;}
.block2{width:100px;background:#F8F8FF;padding:5px;border:solid 1px black;float:left;position:relative;top:10px;left:20px;}
.block3{width:140px;height:240px;background:#FFE4B5;padding:5px;border:solid 1px black;float:middle;position:relative;top:0px;left:140px;}
.block4{width:100px;background:#F0FFF0;padding:5px;border:solid 1px black;float:rigth;position:relative;top:-150px;left:340px;}
.block5{width:60px;height:80px;background:#FFFF00;padding:5px;margin:5px;border:solid 1px black;}
.block6{width:30px;height:80px;background:#D8BFD8;padding:5px;margin:5px;border:solid 1px black;}
.block7{background:#d6e5f4;}
</style>
<script type="text/javascript">
function focusInDiv(locator) {locator.className="block7";}
</script>
</header>
<body>
<input type="text" id="test" value="testik"><br>
<div id="main" class="block1"><h1>MAIN</h1>
<div id="left" class="block2"><h1>LEFT</h1></div>
<div id="middle" class="block3"><h1>MIDDLE</h1>
<div id="middle_1" class="block5"><h2>1</h2>
<div id="middle_2" class="block6"><h4>2</h4></div>
</div>
</div>
<div id="right" class="block4"><h1>RIGHT</h1></div>
</div>
</body>
</html>

----------------------------------------------
package test.iebrowser.com;

import static org.junit.Assert.*;

import java.io.File;
import java.util.concurrent.TimeUnit;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.openqa.selenium.JavascriptExecutor;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.openqa.selenium.ie.InternetExplorerDriver;
import org.openqa.selenium.remote.DesiredCapabilities;
import org.openqa.selenium.support.ui.ExpectedCondition;
import org.openqa.selenium.support.ui.WebDriverWait;

public class MyIETest {

private WebDriver driver = null;
private JavascriptExecutor js = null;
private static String BASE_URL = "http://localhost/div_test.html";
private static String TYPE_BROWSER = "IE"; //"IE" "FF"

private String eventListenerById(String idElement, String event, String handler, String useCapture) {
String addListener = (TYPE_BROWSER.equals("IE") ? "attachEvent" : "addEventListener");
String removeListener = (TYPE_BROWSER.equals("IE") ? "detachEvent" : "removeEventListener");
event = ("focus".equals(event) ? ("IE".equals(TYPE_BROWSER) ? event : "click") : event);
String listener = (TYPE_BROWSER.equals("IE") ? "on" + event : event);
String obj = "var obj = document.getElementById(\"" + idElement + "\");";
String arg = "\"" + listener + "\", function(e){" + handler + "(obj);}, " + useCapture;
return obj +
"obj." + addListener + "(" + arg + ");" +
"obj." + event + "();" +
"obj." + removeListener + "(" + arg + ");";
}

@Test
public void testUntitled() throws InterruptedException{
driver.get(BASE_URL);
(new WebDriverWait(driver, 15)).until(new ExpectedCondition<Boolean>() {
public Boolean apply(WebDriver d) {
return d.getTitle() != null;
}
});
assertEquals("testik",js.executeScript("return document.getElementById(\"test\").value;"));
js.executeScript(eventListenerById("main", "focus", "focusInDiv", "true"));
Thread.sleep(500);/* задержка только для удобства наблюдения за процессом */
js.executeScript(eventListenerById("left", "focus", "focusInDiv", "true"));
Thread.sleep(500);
js.executeScript(eventListenerById("middle", "focus", "focusInDiv", "true"));
Thread.sleep(500);
js.executeScript(eventListenerById("middle_1", "focus", "focusInDiv", "true"));
Thread.sleep(500);
js.executeScript(eventListenerById("middle_2", "focus", "focusInDiv", "true"));
Thread.sleep(500);
js.executeScript(eventListenerById("right", "focus", "focusInDiv", "true"));
Thread.sleep(500);
assertTrue(Boolean.TRUE);
}

@Before
public void setUp() throws Exception {
if(TYPE_BROWSER.equals("IE")){
driver = new InternetExplorerDriver();
}else{
driver = new FirefoxDriver();
}
driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS);
js = (JavascriptExecutor) driver;
}

@After
public void tearDown() throws Exception {
driver.quit();
}

}
  • 0

#13 Salomon

Salomon

    Новый участник

  • Members
  • Pip
  • 8 сообщений

Отправлено 20 июля 2012 - 06:37

Получилось кликнуть на необходимый див c помощью myElement.moveToElement(myElement, xOffset, yOffset).click().build().perfom(), в качестве аргументов х и у передали 1.
  • 0

#14 sawoy

sawoy

    Новый участник

  • Members
  • Pip
  • 51 сообщений
  • ФИО:Alex Savchuk

Отправлено 20 июля 2012 - 11:30

Привет!

Так вот. При выполнении driver.findElement(By.id("main")).getLocation() и driver.findElement(By.id("child1")).getLocation(), я получаю одинаковае координаты.

Под координатами имеются ввиду (x, y) или (x, y, width, height) ? Если второе, то выглядит как баг.

И при этом driver.findElement(By.id("main")).click() клик проходится на child8,

Это нормально по идее - клик делается по "средней точке" элемента на основе его (x, y, width, height).

driver.findElement(By.id("child1")).click() попадает в anotherDiv. То же самое происходит и в Actions.


А вот это очень странно и выглядит как баг.

Для повторения нужен HTML страницы (желательно со всеми ресурсами) и код теста.
Ну и версию IE, IE document mode, IE browser mode, Windows etc тоже желательно.

Можете предоставить это?
  • 0

#15 Salomon

Salomon

    Новый участник

  • Members
  • Pip
  • 8 сообщений

Отправлено 23 июля 2012 - 11:16

Увы, как я уже говорил html дать не могу. Но есть хорошее продвижение, мне выдали специально обученного программиста) Поэтому дело пошло быстрее и как тест будет готов я выложу решение сюда.

Версия ИЕ 8.
  • 0


Количество пользователей, читающих эту тему: 1

0 пользователей, 1 гостей, 0 анонимных