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.
Ne Zaman Actions Kullanılır?
Section titled “Ne Zaman Actions Kullanılır?”- 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()veyaelement.sendKeys()yeterliyse onları tercih edin. Actions, ihtiyaca göre devreye alınmalı.
Bağımlılıklar ve Kurulum
Section titled “Bağımlılıklar ve Kurulum”<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.
Hızlı Başlangıç
Section titled “Hızlı Başlangıç”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’daperform()yeterlidir.
Temel Fare Eylemleri
Section titled “Temel Fare Eylemleri”Actions act = new Actions(driver);
WebElement btn = driver.findElement(By.id("submit"));WebElement box = driver.findElement(By.id("box"));
// Sol tıkact.click(btn).perform();
// Sağ tık (context click)act.contextClick(box).perform();
// Çift tıkact.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();Zincirleme (Chaining) ve Akış
Section titled “Zincirleme (Chaining) ve Akış”act.moveToElement(box) .pause(Duration.ofMillis(200)) .doubleClick() .pause(Duration.ofMillis(200)) .contextClick() .perform();Klavye Eylemleri
Section titled “Klavye Eylemleri”WebElement input = driver.findElement(By.id("search"));
// Basit yazımnew Actions(driver).click(input).sendKeys("selenium actions").perform();
// Tuş kombinasyonları: CTRL + A, CTRL + Cnew Actions(driver) .click(input) .keyDown(Keys.CONTROL).sendKeys("a").keyUp(Keys.CONTROL) .keyDown(Keys.CONTROL).sendKeys("c").keyUp(Keys.CONTROL) .perform();
// Özel karakterler ve ENTERnew Actions(driver).click(input).sendKeys("iPhone 16 Pro", Keys.ENTER).perform();macOS için
Keys.COMMANDkullanılabilir. Metin alanına odaklanmak için önceclick(input)eklemek önemlidir.
Drag & Drop (Sürükle-Bırak)
Section titled “Drag & Drop (Sürükle-Bırak)”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();2) Offset ile manuel sürükleme
Section titled “2) Offset ile manuel sürükleme”WebElement source = driver.findElement(By.id("drag-handle"));
new Actions(driver) .clickAndHold(source) .moveByOffset(150, 0) // 150px sağa .release() .perform();3) clickAndHold / moveToElement / release
Section titled “3) clickAndHold / moveToElement / release”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.
Kaydırma (Scroll) – Selenium 4+
Section titled “Kaydırma (Scroll) – Selenium 4+”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ırWebElement 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
scrollToElementprojenizde yoksa Selenium sürümünüzü güncelleyin veya((JavascriptExecutor)driver).executeScript("arguments[0].scrollIntoView(true);", el);ile JS fallback kullanın.
Gerçek Dünya Senaryoları
Section titled “Gerçek Dünya Senaryoları”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
moveToElementzincirinde öğ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”| Metot | Açı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+) |
Hata Giderme (Troubleshooting)
Section titled “Hata Giderme (Troubleshooting)”- ElementNotInteractableException: Öğeye görünürlük/odak kazandırın,
scrollToElementveya JSscrollIntoViewdeneyin. - 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);En İyi Uygulamalar
Section titled “En İyi Uygulamalar”- 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.