Scroll element in beeld met selenium

Is er een manier in Selenium 1.x of 2.x om door het browservenster te scrollen zodat een bepaald element dat wordt geïdentificeerd door een XPath in het zicht is van de browser? Er is een focusmethode in Selenium, maar het lijkt niet fysiek door de weergave in FireFox te scrollen. Heeft iemand suggesties om dit te doen?

De reden dat ik dit nodig heb, is dat ik de klik van een element op de pagina aan het testen ben. Helaas lijkt de gebeurtenis niet te werken tenzij het element zichtbaar is. Ik heb geen controle over de code die wordt geactiveerd wanneer op het element wordt geklikt, dus ik kan er geen fouten in opsporen of er wijzigingen in aanbrengen, dus de gemakkelijkste oplossing is om het item in beeld te schuiven.


Antwoord 1, autoriteit 100%

Heb veel dingen geprobeerd met betrekking tot scrollen, maar de onderstaande code heeft betere resultaten opgeleverd.

Dit zal scrollen totdat het element in beeld is:

WebElement element = driver.findElement(By.id("id_of_element"));
((JavascriptExecutor) driver).executeScript("arguments[0].scrollIntoView(true);", element);
Thread.sleep(500); 
//do anything you want with the element

Antwoord 2, autoriteit 68%

Je kunt de klasse org.openqa.selenium.interactions.Actionsgebruiken om naar een element te gaan.

Java:

WebElement element = driver.findElement(By.id("my-id"));
Actions actions = new Actions(driver);
actions.moveToElement(element);
actions.perform();

Python:

from selenium.webdriver.common.action_chains import ActionChains
ActionChains(driver).move_to_element(driver.sl.find_element_by_id('my-id')).perform()

Antwoord 3, autoriteit 11%

JavascriptExecutor js = (JavascriptExecutor) driver;
        js.executeScript("javascript:window.scrollBy(250,350)");

Mogelijk wilt u dit proberen.


Antwoord 4, Autoriteit 6%

Als u op het Firefox-venster wilt bladeren met behulp van de Selenium WebDriver, is een van de manieren om JavaScript in de Java-code te gebruiken. De JavaScript-code om naar beneden te bladeren (naar de onderkant van de webpagina) is als volgt:

JavascriptExecutor js = (JavascriptExecutor) driver;
js.executeScript("window.scrollTo(0, Math.max(document.documentElement.scrollHeight, document.body.scrollHeight, document.documentElement.clientHeight));");

Antwoord 5, Autoriteit 6%

Targeting van elk element en verzendtoetsen verzenden (of omhoog / Links / rechts) lijkt ook te werken. Ik weet dat dit een beetje een hack is, maar ik ben niet echt in het idee om JavaScript te gebruiken om het scroll-probleem ook op te lossen.

Bijvoorbeeld:

WebElement.sendKeys(Keys.DOWN);

Antwoord 6, Autoriteit 4%

In Selenium moeten we de hulp nemen van een JavaScript-uitvoerder om naar een element te bladeren of door de pagina te bladeren:

je.executeScript("arguments[0].scrollIntoView(true);", element);

In de bovenstaande verklaring elementis het exacte element waar we moeten scrollen. Ik heb de bovenstaande code geprobeerd en het werkte voor mij.

Ik heb een complete post en video hierover:

http://learn-automation. com/how-to-scroll-into-view-in-selenium-webdriver/


Antwoord 7, autoriteit 4%

webElement = driver.findElement(By.xpath("bla-bla-bla"));
((JavascriptExecutor)driver).executeScript("arguments[0].scrollIntoView();", webElement);

Voor meer voorbeelden, ga hier. Allemaal in het Russisch, maar Java-code is intercultureel 🙂


Antwoord 8, autoriteit 2%

Je kunt dit codefragment gebruiken om te scrollen:

C#

var element = Driver.FindElement(By.Id("element-id"));
Actions actions = new Actions(Driver);
actions.MoveToElement(element).Perform();

Daar heb je het


Antwoord 9, autoriteit 2%

Gebruik het stuurprogramma om sleutels zoals de pagedownof downarrow-toets te verzenden om het element in beeld te brengen. Ik weet dat het een te simpele oplossing is en misschien niet in alle gevallen van toepassing is.


Antwoord 10, autoriteit 2%

Dit werkte voor mij:

IWebElement element = driver.FindElements(getApplicationObject(currentObjectName, currentObjectType, currentObjectUniqueId))[0];
 ((IJavaScriptExecutor)driver).ExecuteScript("arguments[0].scrollIntoView(true);", element);

Antwoord 11, autoriteit 2%

Uit ervaring weet Selenium Webdriver niet automatisch naar een element te scrollen wanneer er meer dan één scrollbare sectie op de pagina is (wat vrij gebruikelijk is).

Ik gebruik Ruby en voor mijn AUT moest ik de klikmethode als volgt aanpassen;

class Element
      #
      # Alias the original click method to use later on
      #
      alias_method :base_click, :click
      # Override the base click method to scroll into view if the element is not visible
      # and then retry click
      #
      def click
        begin
          base_click
        rescue Selenium::WebDriver::Error::ElementNotVisibleError
          location_once_scrolled_into_view
          base_click
        end
      end

De methode ‘location_once_scrolled_into_view’ is een bestaande methode in de WebElement-klasse.

Ik waardeer het dat je Ruby misschien niet gebruikt, maar het zou je wat ideeën moeten geven.


Antwoord 12

Selenium 2 probeert naar het element te scrollen en er vervolgens op te klikken. Dit komt omdat Selenium 2 geen interactie zal hebben met een element tenzij het denkt dat het zichtbaar is.

Scrollen naar het element gebeurt impliciet, dus u hoeft alleen maar het item te vinden en ermee te werken.


Antwoord 13

Het Ruby-script om een element in beeld te laten scrollen is als volgt.

$driver.execute_script("arguments[0].scrollIntoView(true);", element)
sleep(3)
element.click

Antwoord 14

Soms had ik ook te maken met het probleem van scrollen met Selenium. Dus gebruikte ik javaScriptExecuter om dit te bereiken.

Om naar beneden te scrollen:

WebDriver driver = new ChromeDriver();
JavascriptExecutor js = (JavascriptExecutor)driver;
js.executeScript("window.scrollBy(0, 250)", "");

Of ook

js.executeScript("scroll(0, 250);");

Om omhoog te scrollen:

js.executeScript("window.scrollBy(0,-250)", "");

Of,

js.executeScript("scroll(0, -250);");

Antwoord 15

Als u denkt dat andere antwoorden te hacky waren, is deze ook, maar er is geen javascript-injectie bij betrokken.

Wanneer de knop uit het scherm is, breekt en scrollt ernaar, dus probeer het opnieuw … Â \ _ (ツ) _ / ¯

try
{
    element.Click();
}
catch {
    element.Click();
}

Antwoord 16

Dit is een herhaalde oplossing met JavaScript, maar met een extra wachtend op element.

Anders ElementNotVisibleExceptionkan verschijnen als er enige actie op het element wordt uitgevoerd.

this.executeJavaScriptFunction("arguments[0].scrollIntoView(true);", elementToBeViewable);
WebDriverWait wait = new WebDriverWait(getDriver(), 5);
wait.until(ExpectedConditions.visibilityOf(elementToBeViewable));

Antwoord 17

Ik heb deze manier gebruikt voor het scrollen van het element en klik op:

List<WebElement> image = state.getDriver().findElements(By.xpath("//*[contains(@src,'image/plus_btn.jpg')]"));
for (WebElement clickimg : image)
{
  ((JavascriptExecutor) state.getDriver()).executeScript("arguments[0].scrollIntoView(false);", clickimg);
  clickimg.click();
}

Antwoord 18

def scrollToElement(element: WebElement) = {
  val location = element.getLocation
  driver.asInstanceOf[JavascriptExecutor].executeScript(s"window.scrollTo(${location.getX},${location.getY});")
}

Antwoord 19

Mogelijk wilt u pagina scroll Web-elementen en webpagina-Selenium Webdriver met Javascript :

public static void main(String[] args) throws Exception {
    // TODO Auto-generated method stub
    FirefoxDriver ff = new FirefoxDriver();
    ff.get("http://toolsqa.com");
    Thread.sleep(5000);
    ff.executeScript("document.getElementById('text-8').scrollIntoView(true);");
}

Antwoord 20

In de meeste van de situatie voor het scrollen van deze code werkt.

WebElement element = driver.findElement(By.xpath("xpath_Of_Element"));                 
js.executeScript("arguments[0].click();",element);

Antwoord 21

java

Probeer Scroll naar Element Gebruik x yPositie en gebruik JavascriptExecutorHiermee is argument: "window.scrollBy(x, y)".

Volgend import:

import org.openqa.selenium.WebElement;
import org.openqa.selenium.JavascriptExecutor;

Eerst moet u ontvangen x ylocatie het element.

//initialize element
WebElement element = driver.findElement(By.id("..."));
//get position
int x = element.getLocation().getX();
int y = element.getLocation().getY();
//scroll to x y 
JavascriptExecutor js = (JavascriptExecutor) driver;
js.executeScript("window.scrollBy(" +x +", " +y +")");

Antwoord 22

Ik weet niet zeker of de vraag nog steeds relevant is, maar na het verwijzen naar ScrollIntoView-documentatie van https://developer.mozilla.org/en-us/docs/web/api/element/scrollIntoView .

De eenvoudigste oplossing zou

zijn

executor.executeScript("arguments[0].scrollIntoView({block: \"center\",inline: \"center\",behavior: \"smooth\"});",element);

Hiermee scrollt u het element in het midden van de pagina.


Antwoord 23

Het standaardgedrag van Selenium US om te bladeren, zodat het element nauwelijks in zicht is aan de bovenkant van de viewport. Ook hebben niet alle browsers precies hetzelfde gedrag. Dit is erg slecht. Als u video’s van uw browserproeven opneemt, zoals ik, is wat u wilt, is het voor het element om in beeld te bladeren en verticaal gecentreerd te zijn .

Hier is mijn oplossing voor Java:

public List<String> getBoundedRectangleOfElement(WebElement we)
{
    JavascriptExecutor je = (JavascriptExecutor) driver;
    List<String> bounds = (ArrayList<String>) je.executeScript(
            "var rect = arguments[0].getBoundingClientRect();" +
                    "return [ '' + parseInt(rect.left), '' + parseInt(rect.top), '' + parseInt(rect.width), '' + parseInt(rect.height) ]", we);
    System.out.println("top: " + bounds.get(1));
    return bounds;
}

En vervolgens, om te scrollen, noemt u het als volgt:

public void scrollToElementAndCenterVertically(WebElement we)
{
    List<String> bounds = getBoundedRectangleOfElement(we);
    Long totalInnerPageHeight = getViewPortHeight(driver);
    JavascriptExecutor je = (JavascriptExecutor) driver;
    je.executeScript("window.scrollTo(0, " + (Integer.parseInt(bounds.get(1)) - (totalInnerPageHeight/2)) + ");");
    je.executeScript("arguments[0].style.outline = \"thick solid #0000FF\";", we);
}

Antwoord 24

Iets dat voor mij werkte, was om de browser te gebruiken. Movemousetoelement-methode op een element onderaan het browservenster. Wonderbaarlijk werkte het in Internet & Nbsp; Explorer, Firefox en Chrome.

Ik koos dit over de JavaScript-injectietechniek, alleen maar omdat het minder hacky voelde.


Antwoord 25

Ik heb het testen met ADF-componenten en je moet een aparte opdracht hebben om te scrollen als Lazy Loading wordt gebruikt. Als het object niet is geladen en u probeert het te vinden met Selenium, gooit Selenium een ​​element-niet-gevonden uitzondering.


Antwoord 26

Probeer dit als niets werkt voordat u op:

klikt

public void mouseHoverJScript(WebElement HoverElement) {
    String mouseOverScript = "if(document.createEvent){var evObj = document.createEvent('MouseEvents');evObj.initEvent('mouseover', true, false); arguments[0].dispatchEvent(evObj);} else if(document.createEventObject) { arguments[0].fireEvent('onmouseover');}";
    ((JavascriptExecutor) driver).executeScript(mouseOverScript, HoverElement);
}

Antwoord 27

In Java kunnen we scrollen met JavaScript, zoals in de volgende code:

driver.getEval("var elm = window.document.getElementById('scrollDiv'); if (elm.scrollHeight > elm.clientHeight){elm.scrollTop = elm.scrollHeight;}");

U kunt een gewenste waarde toewijzen aan de variabele “ELM.SCROLLTOT”.


Antwoord 28

Een oplossing is:

public void javascriptclick(String element)
{
    WebElement webElement = driver.findElement(By.xpath(element));
    JavascriptExecutor js = (JavascriptExecutor) driver;
    js.executeScript("arguments[0].click();", webElement);
    System.out.println("javascriptclick" + " " + element);
}

Antwoord 29

Deze code werkt voor mij:

JavascriptExecutor js = (JavascriptExecutor) driver;
js.executeScript("javascript:window.scrollBy(250, 350)");

ANTWOORD 30

Selenium kan automatisch naar een element in de schuifbalk scrollen voor een eenvoudige gebruikersinterface, maar voor een luie gebruikersinterface is scrollToElement nog steeds nodig.

Dit is mijn implementatie in Java met JavascriptExecutor.
U kunt meer details vinden in de Satix-broncode:
http://www.binpress.com/app/ satix-seleniumbased-automation-testing-in-xml/1958

public static void perform(WebDriver driver, String Element, String ElementBy, By by) throws Exception {
 try {
  //long start_time = System.currentTimeMillis();           
  StringBuilder js = new StringBuilder();
  String browser = "firefox";
  if (ElementBy.equals("id")) {
   js.append("var b = document.getElementById(\"" +
    Element + "\");");
  } else if (ElementBy.equals("xpath")) {
   if (!"IE".equals(browser)) {
    js.append("var b = document.evaluate(\"" +
     Element +
     "\", document, null, XPathResult.ANY_TYPE, null).iterateNext();");
   } else {
    throw new Exception("Action error: xpath is not supported in scrollToElement Action in IE");
   }
  } else if (ElementBy.equals("cssSelector")) {
   js.append("var b = document.querySelector(\"" +
    Element + "\");");
  } else {
   throw new Exception("Scroll Action error");
  }
  String getScrollHeightScript = js.toString() + "var o = new Array(); o.push(b.scrollHeight); return o;";
  js.append("b.scrollTop = b.scrollTop + b.clientHeight;");
  js.append("var tmp = b.scrollTop + b.clientHeight;");
  js.append("var o = new Array(); o.push(tmp); return o;");
  int tries = 1;
  String scrollTop = "0";
  while (tries > 0) {
   try {
    String scrollHeight = ((JavascriptExecutor) driver).executeScript(getScrollHeightScript).toString();
    if (scrollTop.equals(scrollHeight)) {
     break;
    } else if (driver.findElement(by).isDisplayed()) {
     break;
    }
    Object o = ((JavascriptExecutor) driver).executeScript(js.toString());
    scrollTop = o.toString();
    Thread.sleep(interval);
    tries++;
   } catch (Exception e) {
    throw new Exception("Action error:" +
     " javascript execute error : " + e.getMessage() + ", javascript : " + js.toString());
   }
  }
 } catch (Exception e) {
  try {
   ScreenshotCapturerUtil.saveScreenShot(driver, CLASSNAME);
  } catch (IOException e1) {
   throw new Exception("Save screenshot error!", e1);
  }
  throw e;
 }
}

Other episodes