All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.tribbloids.spookystuff.selenium.BySizzleCssSelector Maven / Gradle / Ivy

package com.tribbloids.spookystuff.selenium;

import org.apache.commons.io.IOUtils;
import org.openqa.selenium.*;

import java.io.Serializable;
import java.util.List;

public class BySizzleCssSelector extends By implements Serializable {

  private static final long serialVersionUID = -584931842702178943L;

  private final String selector;

  private static String sizzleSource = null;

  public BySizzleCssSelector(String selector) {
    this.selector = selector;
  }

  @Override
  public List findElements(SearchContext context) {

    if (context instanceof JavascriptExecutor) {
      return evaluateSizzleSelector((JavascriptExecutor) context, selector);
    }
    else {
      throw new WebDriverException(
        "Driver does not support finding an element by selector: " + selector);
    }
  }

  @Override
  public String toString() {
    return "By.selector: " + selector;
  }

  protected List evaluateSizzleSelector(JavascriptExecutor context, String selector) {
    injectSizzleIfNeeded(context);

    String sizzleSelector = selector.replace("By.selector: ", "");
    if (context instanceof WebElement)
      return executeJavaScript(context, "return Sizzle(arguments[0], arguments[1])", sizzleSelector, context);
    else
      return executeJavaScript(context, "return Sizzle(arguments[0])", sizzleSelector);
  }

  protected void injectSizzleIfNeeded(JavascriptExecutor context) {
    if (!sizzleLoaded(context)) {
      injectSizzle(context);
    }
  }

  protected Boolean sizzleLoaded(JavascriptExecutor context) {
    try {
      return executeJavaScript(context, "return Sizzle() != null");
    } catch (WebDriverException e) {
      return false;
    }
  }

  protected synchronized void injectSizzle(JavascriptExecutor context) {
    if (sizzleSource == null) {
      try {
        sizzleSource = IOUtils.toString(this.getClass().getResource("/sizzle.js"));
      } catch (Throwable e) {
        throw new RuntimeException("Cannot load sizzle.js from classpath", e);
      }
    }
    executeJavaScript(context, sizzleSource);
  }

  protected static  T executeJavaScript(JavascriptExecutor context, String jsCode, Object... arguments) {
    return (T) context.executeScript(jsCode, arguments);
  }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy