Есть отличная удаленная работа для php+codeception+jenkins+allure+docker спецов. 100% remote! Присоединиться к проекту

Меню не позволяет корректно работать с WebDriver


(Alex) #1

Здравствуйте, столкнулся со следующей проблемой. На странице есть footer и header (похожее меню есть у вас на сайте в “шапке”), при поиске Checkbox в хроме:

driver.findElement(By.id("row_isBarker")).click(); - checkbox

driver не обращает внимание на меню и пытается кликнуть по Checkbox, соответственно выскакивает ошибка:

“Element is not clickable at point…”. Поискав у вас на сайте и в инете, пришел к выводу, что это из-за бага драйвера.

Продолжил тестировать в Firefox и все вроде бы хорошо, но когда я пытаюсь кликнуть в List2List, элемент:

driver.findElement(By.xpath("//*[@name='Плашки']//ul[@class='left-list-container ng-scope']//label[contains(.,'aa_test')]")).click();

driver просто пропускает элемент т.к. он находится опять под меню. Что можно сделать в данной ситуации?

P.S. в итоге я сижу с делемой, если я использую Chrome, не могу использовать Checkbox и наоборот с Firefox - могу использовать Checkbox но не могу List2List. Кстати в Firefox элементы у меня нормально находятся, только тогда,когда страница промотана вверх, поэтому в коде приходится вставлять костыли в виде:

driver.findElement(By.cssSelector("body")).sendKeys(Keys.HOME);

Версию браузера использовал последнюю Firefox:28.0, у Chrome 34.0.1847.131 m


(Александр) #2

В таких ситуациях проще всего скрывать мешающий элемент js-ом, на примере этого сайта:

document.getElementsByClassName('ember-view d-header clearfix')[0].style.display='none'

убирает липкий блок со страницы.


(svim) #3

Так, a в Chrome получается кликнуть по-элементу, если прокрутить вверх?


(Руслан) #4

Scroll Down:

 import org.openqa.selenium.JavascriptExecutor;

     WebDriver driver = new FirefoxDriver();
     JavascriptExecutor jse = (JavascriptExecutor)driver;
     jse.executeScript("scroll(0, 250)"); //y value '250' can be altered

Scroll up:

JavascriptExecutor jse = (JavascriptExecutor)driver;
 jse.executeScript("scroll(250, 0)"); //x value '250' can be altered

(Alex) #5

Если я пробую в Chrome вручную перематывать страницы, то все корректно работает. Сейчас написал метод в котором если нажимаемый элемент находиться под меню, то выполнить скролл на 200 пикселей по отношению к footer или header. Часть кода:

public void autoScrollToList2List(WebElement element){
		
	js = new JavaScripts(driver);
	WebElement header = driver.findElement(By.cssSelector("header"));
	WebElement footer = driver.findElement(By.cssSelector("footer [class='buttonbar-fixed ng-scope']"));
		
	int getSizeHeader = header.getSize().getHeight();
	int getSizeFooter = footer.getSize().getHeight();
	int getSizeElement = element.getSize().height;
		
	int getLocationHeaderTop = header.getLocation().getY();
	int getLocationFooterTop = footer.getLocation().getY();
	int getLocationElementTop = element.getLocation().getY();
		
	int getLocationHeaderBottom = getSizeHeader + getLocationHeaderTop;
	int getLocationElementBottom = getSizeElement + getLocationElementTop;
		
		
if(getLocationElementBottom < getLocationHeaderBottom)
		js.scroll(element, 0, -200);                    // JavaScript
		
if(getLocationElementTop > getLocationFooterTop)
		js.scroll(element, 0, +200);                   // JavaScript
		
	}

P.S. Буду рад если кому нибудь пригодится =)

P.S.S. вчера вышла новая версия FireFox, теперь все работает без костылей.