как реализовать waitObject, когда object доступен в ДОМ модели, но не прорисован?


(Mykhailo Poliarush) #1

Selenium 2.0


(d3unka) #2

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

package com.test.webdriver;

import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.openqa.selenium.support.ui.ExpectedCondition;
import org.openqa.selenium.support.ui.Wait;
import org.openqa.selenium.support.ui.WebDriverWait;
import org.testng.annotations.AfterTest;
import org.testng.annotations.BeforeTest;
import org.testng.annotations.Test;

public class ClassTest {

	private WebDriver driver;

	@BeforeTest
	public void setUp() {
		driver = new FirefoxDriver();
	}
	
	@Test
	public void testTest() throws InterruptedException {
		driver.get("http://www.google.com.ua");
	    Wait<WebDriver> wait = new WebDriverWait(driver, 10);
		WebElement hiddenElement = wait.until(elementPresentLocatedBy(By.id("wgjc")));
		System.out.println(hiddenElement.getAttribute("style"));
	}
	
	@AfterTest
	public void tearDown() {
		driver.quit();
	}
	
	  private ExpectedCondition<WebElement> elementPresentLocatedBy(final By webElement) {
		  return new ExpectedCondition<WebElement>() {
		   @Override
		   public WebElement apply(WebDriver arg0) {
			    WebElement element = driver.findElement(webElement);
			    if (element.getTagName() != null) {
			        return element;
			      }
			      return null;
		   }
		  };
	  }
}

(akeem) #3

Можно попробывать переопределить метод getElement для hidden елементов дома которые присудствуют  в DOM

/**
 * 
 */
package org.openqa.selenium.htmlunit;

import org.openqa.selenium.RenderedWebElement;
import org.openqa.selenium.WebElement;

import com.gargoylesoftware.htmlunit.html.HtmlElement;

/**
 * @author oleksiizozulenko
 *
 */
public interface ObbRenderedWebElement extends RenderedWebElement, WebElement {

 public HtmlElement getElement();
}

 

package org.openqa.selenium.htmlunit;

import org.openqa.selenium.ElementNotVisibleException;
import org.openqa.selenium.RenderedWebElement;
import org.openqa.selenium.htmlunit.HtmlUnitDriver;
import org.openqa.selenium.htmlunit.RenderedHtmlUnitDriverWebElement;

import com.gargoylesoftware.htmlunit.html.HtmlElement;
import com.gargoylesoftware.htmlunit.html.HtmlHiddenInput;

/**
 * @author oleksiizozulenko
 *
 */
public class ObbHtmlUnitRenderedWebElement extends
RenderedHtmlUnitDriverWebElement implements ObbRenderedWebElement {

    static RenderedHtmlUnitDriverWebElement instance;
    /**
     * @param parent
     * @param element
     */
    public ObbHtmlUnitRenderedWebElement(HtmlUnitDriver parent,
            HtmlElement element) {
        super(parent, element);
    }
    
    public static RenderedHtmlUnitDriverWebElement getInstance(RenderedWebElement obj)
    {
        instance = (RenderedHtmlUnitDriverWebElement) obj;
        return instance;
    }
    
    public static void selectOption(RenderedWebElement obj)
    {
        instance = (RenderedHtmlUnitDriverWebElement) obj;
        
        instance.assertElementNotStale();

         if (!(instance.element instanceof HtmlHiddenInput) && instance.element.isDisplayed())
             throw new ElementNotVisibleException("You may only select visible elements");
            
        String disabledValue = instance.element.getAttribute("disabled");
        if (disabledValue.length() > 0) {
          throw new UnsupportedOperationException("You may not select a disabled element");
        }

        if (instance.element instanceof com.gargoylesoftware.htmlunit.html.HtmlOption) {
          ((com.gargoylesoftware.htmlunit.html.HtmlOption) instance.element).setSelected(true);
        } else {
          throw new UnsupportedOperationException(
              "Unable to select element. Tag name is: " + instance.element.getTagName());
        }
    }
    
    public HtmlElement getElement()
    {
        return instance.element;
    }

}