İçeriğe geç

Selenium Actions Sınıfı

Actions, Selenium WebDriver ile fare ve klavye etkileşimlerini gerçekçi bir şekilde simüle etmenizi sağlayan güçlü bir API’dir. Basit click() ve sendKeys() çağrılarının ötesine geçerek hover, drag & drop, çoklu tuş kombinasyonları, sağ tıklama, çift tıklama ve kaydırma (scroll) gibi zengin etkileşimleri modeller.


  • Menü açmak için bir öğenin üzerine hover olmak gerektiğinde
  • Sürükle-bırak (drag & drop) işlemleri
  • Sağ tık (context menu) ve çift tık
  • Tuş kombinasyonları (CTRL/⌘ + A, C, V vb.)
  • Offset ile hassas konum tıklamaları
  • Selenium 4+ ile kaydırma (scroll) eylemleri

Not: Standart WebElement.click() veya element.sendKeys() yeterliyse onları tercih edin. Actions, ihtiyaca göre devreye alınmalı.


pom.xml
<dependencies>
<dependency>
<groupId>org.seleniumhq.selenium</groupId>
<artifactId>selenium-java</artifactId>
<version>4.23.0</version>
</dependency>
<dependency>
<groupId>io.github.bonigarcia</groupId>
<artifactId>webdrivermanager</artifactId>
<version>5.9.2</version>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter</artifactId>
<version>5.11.0</version>
<scope>test</scope>
</dependency>
</dependencies>

Versiyonlar örnektir; proje standardınıza göre güncelleyiniz.


import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.interactions.Actions;
public class ActionsQuickStart {
public static void main(String[] args) {
WebDriver driver = new ChromeDriver();
driver.get("https://example.com");
WebElement menu = driver.findElement(By.cssSelector("#products"));
Actions act = new Actions(driver);
// Hover ve tıklama
act.moveToElement(menu).click().perform();
driver.quit();
}
}

perform() zincirdeki eylemleri hemen çalıştırır. build() çoğu zaman opsiyoneldir; modern Selenium’da perform() yeterlidir.


Actions act = new Actions(driver);
WebElement btn = driver.findElement(By.id("submit"));
WebElement box = driver.findElement(By.id("box"));
// Sol tık
act.click(btn).perform();
// Sağ tık (context click)
act.contextClick(box).perform();
// Çift tık
act.doubleClick(box).perform();
// Hover (üzerine gelme)
act.moveToElement(box).perform();
// Offset ile tık (öğenin sol-üstünden 10x20 piksel uzaklık)
act.moveToElement(box, 10, 20).click().perform();
act.moveToElement(box)
.pause(Duration.ofMillis(200))
.doubleClick()
.pause(Duration.ofMillis(200))
.contextClick()
.perform();

WebElement input = driver.findElement(By.id("search"));
// Basit yazım
new Actions(driver).click(input).sendKeys("selenium actions").perform();
// Tuş kombinasyonları: CTRL + A, CTRL + C
new Actions(driver)
.click(input)
.keyDown(Keys.CONTROL).sendKeys("a").keyUp(Keys.CONTROL)
.keyDown(Keys.CONTROL).sendKeys("c").keyUp(Keys.CONTROL)
.perform();
// Özel karakterler ve ENTER
new Actions(driver).click(input).sendKeys("iPhone 16 Pro", Keys.ENTER).perform();

macOS için Keys.COMMAND kullanılabilir. Metin alanına odaklanmak için önce click(input) eklemek önemlidir.


1) Standart API (HTML5 destekliyse genellikle yeterlidir)

Section titled “1) Standart API (HTML5 destekliyse genellikle yeterlidir)”
WebElement source = driver.findElement(By.id("drag-handle"));
WebElement target = driver.findElement(By.id("drop-zone"));
new Actions(driver).dragAndDrop(source, target).perform();
WebElement source = driver.findElement(By.id("drag-handle"));
new Actions(driver)
.clickAndHold(source)
.moveByOffset(150, 0) // 150px sağa
.release()
.perform();
WebElement source = driver.findElement(By.id("drag-handle"));
WebElement target = driver.findElement(By.id("drop-zone"));
new Actions(driver)
.clickAndHold(source)
.moveToElement(target)
.release()
.perform();

Bazı modern uygulamalarda native dragAndDrop çalışmayabilir (özellikle kanvas/özel kütüphanelerde). Bu durumda offset yaklaşımı veya uygulamanın desteklediği alternatif etkileşimleri deneyin.


Selenium 4 ile tekerlek (wheel) girdileri eklendi. Birçok dağıtımda Actions üzerinden kullanılabilir:

import org.openqa.selenium.interactions.Actions;
import org.openqa.selenium.interactions.WheelInput;
import org.openqa.selenium.interactions.Sequence;
import org.openqa.selenium.interactions.PointerInput;
import org.openqa.selenium.interactions.Interaction;
import org.openqa.selenium.interactions.ScrollOrigin;
// Belirli bir öğeye kadar kaydır
WebElement card = driver.findElement(By.cssSelector(".product-card"));
new Actions(driver).scrollToElement(card).perform();
// Piksel bazlı kaydır (deltaX, deltaY)
new Actions(driver).scrollByAmount(0, 600).perform();
// Scroll origin kullanımı (ileri düzey)
ScrollOrigin origin = ScrollOrigin.fromElement(card);
new Actions(driver).scrollFromOrigin(origin, 0, 400).perform();

Eğer scrollToElement projenizde yoksa Selenium sürümünüzü güncelleyin veya ((JavascriptExecutor)driver).executeScript("arguments[0].scrollIntoView(true);", el); ile JS fallback kullanın.


1) Hover ile açılan menüden alt öge seçmek

Section titled “1) Hover ile açılan menüden alt öge seçmek”
WebElement catalog = driver.findElement(By.id("menu-catalog"));
WebElement phones = driver.findElement(By.cssSelector("#menu-catalog .submenu a[href*='phones']"));
Actions act = new Actions(driver);
act.moveToElement(catalog)
.pause(Duration.ofMillis(300))
.moveToElement(phones)
.click()
.perform();

2) Çok adımlı form kısayolları (CTRL + Enter ile gönder)

Section titled “2) Çok adımlı form kısayolları (CTRL + Enter ile gönder)”
WebElement comment = driver.findElement(By.id("comment"));
new Actions(driver)
.click(comment)
.sendKeys("Harika ürün!")
.keyDown(Keys.CONTROL).sendKeys(Keys.ENTER).keyUp(Keys.CONTROL)
.perform();

3) Slider bileşenini belirli bir değere taşımak

Section titled “3) Slider bileşenini belirli bir değere taşımak”
WebElement slider = driver.findElement(By.cssSelector(".slider .handle"));
int targetOffset = 80; // px
new Actions(driver)
.clickAndHold(slider)
.moveByOffset(targetOffset, 0)
.release()
.perform();

Beklemeler (Waits) ve Stabilite İpuçları

Section titled “Beklemeler (Waits) ve Stabilite İpuçları”
  • Görünürlük ve tıklanabilirlik sağlanmadan Actions çağırmayın.
  • pause(Duration) küçük gecikmelerle insan davranışını taklit eder, flaky testleri azaltabilir.
  • Ekran çözünürlüğü / zoom değişirse offset değerleri kırılabilir; mümkünse moveToElement(target) tercih edin.
  • Hover menülerde moveToElement zincirinde öğelerin DOM’da hazır olmasını bekleyin.
WebDriverWait wait = new WebDriverWait(driver, Duration.ofSeconds(10));
WebElement menu = wait.until(ExpectedConditions.visibilityOfElementLocated(By.id("menu")));
new Actions(driver).moveToElement(menu).perform();

Sık Kullanılan Metotlar – Hızlı Referans

Section titled “Sık Kullanılan Metotlar – Hızlı Referans”
MetotAçıklama
click(WebElement)Öğeye sol tık
doubleClick(WebElement)Çift tık
contextClick(WebElement)Sağ tık
moveToElement(el[, x, y])Öğeye/offset noktasına götür
moveByOffset(x, y)İmleci piksel bazlı taşı
clickAndHold([el]) / release([el])Basılı tut / Bırak
dragAndDrop(src, dst)Sürükle-bırak
sendKeys(CharSequence…)Tuş basışları
keyDown(Keys) / keyUp(Keys)Modifier tuşları
pause(Duration)Zincirde bekleme
scrollToElement(el)Öğeye kadar kaydır (Selenium 4+)
scrollByAmount(dx, dy)Piksel bazlı kaydır (Selenium 4+)
scrollFromOrigin(origin, dx, dy)Özel başlangıçla kaydır (Selenium 4+)

  • ElementNotInteractableException: Öğeye görünürlük/odak kazandırın, scrollToElement veya JS scrollIntoView deneyin.
  • MoveTargetOutOfBoundsException: Offset’ler ekran dışında kalıyor; öğenin boyutlarını/loglarını kontrol edin.
  • StaleElementReferenceException: DOM güncellenmiş olabilir; öğeyi yeniden locate edin.
  • dragAndDrop çalışmıyor: Canvas/özel kütüphanelerde native DnD desteklenmiyor olabilir → offset yöntemi veya uygulamanın sağladığı alternatifleri kullanın.
  • CI’da başarısız, lokalde başarılı: Headless/ekran boyutu farkları → sabit pencere boyutu ayarlayın (ör. 1366×768), implicit wait yerine explicit wait kullanın.
ChromeOptions options = new ChromeOptions();
options.addArguments("window-size=1366,768");
// options.addArguments("--headless=new");
WebDriver driver = new ChromeDriver(options);

  • Basit etkileşimlerde Actions yerine WebElement API kullanın (daha hızlı ve stabil).
  • Zincirleri mantıksal adımlara bölün; her adımın beklemesini doğru ayarlayın.
  • Test verilerini ve sayfa objelerini (POM) kullanarak etkileşimleri tekrar kullanılabilir hale getirin.
  • Gerektiğinde JavaScript fallback stratejisi belirleyin (scrollIntoView, element.click()).
  • Cross-browser çalışacaksanız el hareketleri ve offset kullanımlarını minimumda tutun.

Mini Proje: Hover → Alt Menü → Drag & Drop → Doğrulama

Section titled “Mini Proje: Hover → Alt Menü → Drag & Drop → Doğrulama”
class ActionsDemoTest {
WebDriver driver;
WebDriverWait wait;
Actions act;
@BeforeEach
void setup() {
WebDriverManager.chromedriver().setup();
driver = new ChromeDriver();
wait = new WebDriverWait(driver, Duration.ofSeconds(10));
act = new Actions(driver);
}
@Test
void complexInteractions() {
driver.get("https://example.com/app");
WebElement menu = wait.until(ExpectedConditions.visibilityOfElementLocated(By.id("menu-catalog")));
WebElement sub = driver.findElement(By.cssSelector("#menu-catalog .submenu a[data-id='phones']"));
act.moveToElement(menu).pause(Duration.ofMillis(200))
.moveToElement(sub).click().perform();
WebElement source = wait.until(ExpectedConditions.visibilityOfElementLocated(By.id("drag-handle")));
WebElement target = driver.findElement(By.id("drop-zone"));
act.dragAndDrop(source, target).perform();
WebElement success = wait.until(ExpectedConditions.visibilityOfElementLocated(By.id("dnd-success")));
assertTrue(success.isDisplayed());
}
@AfterEach
void teardown() { driver.quit(); }
}

S: build() zorunlu mu?
C: Selenium 4’te çoğu senaryoda hayır. perform() zinciri derleyip çalıştırır.

S: Actions ile dosya yükleyebilir miyim?
C: Hayır. Dosya yüklemeleri için <input type="file"> öğesine sendKeys(path) kullanın.

S: TouchActions kullanmalı mıyım?
C: TouchActions depreceated kabul edilir; gerçek mobil jestler için Appium tercih edin.


Özet: Actions, gerçek kullanıcı etkileşimlerini tarayıcıda modellemenin anahtar aracıdır. Doğru beklemeler ve doğru soyutlama ile testleriniz daha stabil ve ifade gücü yüksek hale gelir.