> For the complete documentation index, see [llms.txt](https://bekoturko.gitbook.io/yazilim-gelistirme-wiki/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://bekoturko.gitbook.io/yazilim-gelistirme-wiki/test-gelistirme/arayuz-testleri/webdriver-kullanimlari.md).

# WebDriver Kullanımları

### Sayfada seçilen element yüklenene kadar bekleme

`using OpenQA.Selenium.Support.UI;` eklenmesi gerekmektedir.

```csharp
new WebDriverWait(Driver, new TimeSpan(0, 0, 5)).Until(d => d.FindElement(By.Id(waitId)));
```

### Element bulunamadığında hata alınması

`Driver.FindElement` ile sayfada olmayan bir element aratıldığında "*OpenQA.Selenium.NoSuchElementException*" hatası alınır.

Sayfa olmayan bir element kontrolü yapılacak ise **Driver.FindElements** ile dönen listenin count değerine bakılabilir.

Örnek : sayfada olmayan "df" className aratıldığında;

```csharp
var findElement = Driver.FindElement(By.ClassName("df"));   --> HATA : OpenQA.Selenium.NoSuchElementException
```

```csharp
var findElement = Driver.FindElements(By.ClassName("df"));   --> List count = 0
```

### SetAttribute kullanımı

Selenium .SetAttribute methodu desteklemediği için selenium ile javascript kodu yazılarak attribute degiştirilir.&#x20;

Ayrıca bknz.\
<https://stackoverflow.com/questions/35136773/setattribute-method-for-webelement/35136839>

Örnek : Bir sayfada bulunan datetime picker alanının selenium testi.

```csharp
[Test]
var js = (IJavaScriptExecutor)Driver;
js.ExecuteScript("document.getElementById('UseDate').setAttribute('value', '08.07.2019')");
js.ExecuteScript("document.getElementById('PaymentDate').setAttribute('value', '01.01.2020')");
```

### Alert & Popup kontrolü

Sayfada Popup şeklinde açılan pencerelerin içeriğini kontrol etme ve içerisindeki butonlara erişebilmek için \
bknz: <https://www.guru99.com/alert-popup-handling-selenium.html>

Örnek : Sayfada bulunan Arama çubuğunun Selenium Testi.

```csharp
Driver.SwitchTo().Alert().Text.Should().Be("Arama yapmak için en az 2 karakter yazmalısınız.");
Driver.SwitchTo().Alert().Accept();
```

### İndirme kontrolü

İndirme işlemlerini kontolü için yapılması gereken tarayıcı ayarları \
bknz. [Tarayıcı Ayarları](/yazilim-gelistirme-wiki/test-gelistirme/arayuz-testleri/tarayici-ayarlari.md)

Gerekli tarayıcı ayarları yapıldıktan sonra kodu kullana biliriz;

Örnek: Bir hesaplama sayfası olsun, hesaplama detaylarının PDF olarak indirildiğini düşünelim.

**İndirme kontrolü methodu**

```csharp
protected static void DownloandElement(string browserName, IWebElement downloadElements)
{
    if (browserName.Equals(BrowserOptionNames.Chrome))
    {
        downloadElements.Click();
        Thread.Sleep(5000);
        Directory.GetFiles(Directory.GetCurrentDirectory() + BrowserOptionNames.ChromeTemp).Length.Should().Be(1);
        Thread.Sleep(2000);
        Directory.Delete(Directory.GetCurrentDirectory() + BrowserOptionNames.ChromeTemp, true);
        Thread.Sleep(3000);
    }
    else if (browserName.Equals(BrowserOptionNames.Firefox))
    {
        downloadElements.Click();
        Thread.Sleep(5000);
        Directory.GetFiles(Directory.GetCurrentDirectory() + BrowserOptionNames.FirefoxTemp).Length.Should().Be(1);
        Thread.Sleep(2000);
        Directory.Delete(Directory.GetCurrentDirectory() + BrowserOptionNames.FirefoxTemp, true);
        Thread.Sleep(3000);
    }
}
```

### Iframe tagının içerisinde işlem yapma

`<iframe />` taginin içerisinde selenium ile işlem yapmak için,\
Bknz. <https://www.guru99.com/handling-iframes-selenium.html>

Örnek: Butonların selenium testi.

```
var element = Driver.SwitchTo().Frame(Driver.FindElements(By.ClassName(HtmlElementNames.Fixed_frame))[0]);
element.FindElements(By.TagName(HtmlElementNames.A))[0].Click();
```

### Tab’lar Arasında Geçiş

Bir linke tıklandığında sayfa farklı sekmede açılabilir. Bu durumda selenium Driver’ın aktif olan sekmeye geçmesini sağlamak gerekir. Ayrıca bknz. <https://stackoverflow.com/questions/29502255/is-there-a-way-to-close-a-tab-in-webdriver-or-protractor>

```csharp
//tarayıcıdaki tab’lar alınır.
var tabs = CurrentDriver.WindowHandles;

//1 numaralı tab’a geçmesi sağlanır.
CurrentDriver.SwitchTo().Window(tabs[1]);

//1 numaralı sekmede işlemler yapılır

//bulunulan sekme(1 numaralı tab) kapatılır
CurrentDriver.Close();

//0 numaralı tab’a geçmesi sağlanır.
CurrentDriver.SwitchTo().Window(tabs[0]);  
```

### Local Storage Kontrolü

LocalStorage içindeki bir değişkene ulaşmak için Selenium WebDriver JS olarak çalıştırılır. JS kodu ile LocalStorage değişkenlerine ulaşılabilir.

```csharp
var js = (IJavaScriptExecutor)CurrentDriver;

//getItem içerisine localStorage key ismi yazılır. Bu key’e ait değer string olarak alınır.
var cookieLocalStorageElement = (string)js.ExecuteScript("return localStorage.getItem('cookieCT')");
```

### Tarayıcı Ekran Görüntüsü Alma

Tarayıcıda açık olan sayfanın ekran görüntüsü almak için `TakeScreenshot()` kullanılır. `SaveAsFile("path")` metoduna resmin kaydedileceği yol verilir.

```csharp
string SaveAsFileImagePath = $"{uiTestExceptionsPath}\\{timestamp}.png";
….
CurrentDriver.TakeScreenshot().SaveAsFile(SaveAsFileImagePath);
```

### Sayfa Link Değiştirildiğinde Oluşan “OpenQA.Selenium.StaleElementReferenceException" Hatası

Örnekte belirtilen durum yapıldığında aşağıdaki 2 hata alınmaktadır.

1. OpenQA.Selenium.StaleElementReferenceException : stale element reference: element is not attached to the page document
2. OpenQA.Selenium.StaleElementReferenceException : The element reference of is stale; either the element is no longer attached to the DOM, it is not in the current frame context, or the document has been refreshed

Örnek:

1. A sayfamız üzerinde bulunan linkler *Selenium WebDriver* ile okunarak bir değişkende tutuldu.
2. Linklerden birine tıklanarak B sayfasına gidilir, burada işlemler yapılır.
3. Daha sonra tekrar A sayfasına gidilerek 1. Adımda tutulan değişkenlerde işlem yapılmaya çalışıldığında “OpenQA.Selenium.StaleElementReferenceException” hatası alınmaktadır.

Farklı sayfalar arasında geçiş yapılıyor ise elementler değişkende tutulmamalı! Sayfa üzerinde işlem yapılacağı zaman *Selenium WebDriver* ile elementlere erişilerek işlem yapılmalıdır.

### Link Değişmeyen Durumlarda Navigate().Back() Sorunu

Link’e tıklandığında mevcut sayfaya gidiyor ise Driver().Navigate().Back() yapıldığında browser’ın default sayfasına gider.Örnek:

1. Tarayıcı açılır ve adres çubuğuna [www.foo.com](http://www.foo.com) yazılır.
2. Anasayfa da bulunan logo'ya tıklanır ve bu logo bizi tekrar [www.foo.com](http://www.foo.com) adresine götürür.
3. Selenium WebDriver Navigate Back yapıldığında [www.foo.com](http://www.foo.com) linkine gitmesi beklenir. Ancak (link değişmediği için) browser’ın default sayfasına(örnek: google.com) gider!

Örnekteki durum selenium kod yazımında sorunlara sebep olabileceğinden link’in değişmediği durumlar için dikkat edilmelidir.

#### Driver’da Hata Oluştuğunda ExceptionThrown Tetiklenmesi

Driver üzerinde işlem yapılırken(findElement vb.) hata oluştuğunda ExceptionThrown tetiklenmesi sağlanır. Bunun için Driver EventFiringWebDriver’dan new’lenir.

```csharp
var firingDriver = new EventFiringWebDriver(CurrentDriver);

//Hata oluştuğunda ThrowsTakeScreenshot metoduna gider.
firingDriver.ExceptionThrown += ThrowsTakeScreenshot;

CurrentDriver = firingDriver;
```

### NUnit Test Sonucu Hata Kontrolü

NUnit test sonucu `TestContext.CurrentContext.Result.Outcome.Status`ile öğrenilebilir.

Örnekte *TearDown* içerisinde test sonucu fail ise ekran görüntüsü aldırılmaktadır.

```csharp
[TearDown]
public void ThrowScreenshot()
{
    if (TestContext.CurrentContext.Result.Outcome.Status == TestStatus.Failed)
    {
        var timestamp = DateTime.Now.ToString("yyyy-MM-dd-hhmm-ss");

        var uiTestExceptionsPath = $"{Directory.GetCurrentDirectory()}{BrowserOptionNames.UiTestExceptions}";

        var SaveAsFileImagePath = $"{uiTestExceptionsPath}\\{timestamp}.png";

        var exists = Directory.Exists(uiTestExceptionsPath);
        if (!exists)
        {
            Directory.CreateDirectory(uiTestExceptionsPath);
        }

        CurrentDriver.TakeScreenshot().SaveAsFile(SaveAsFileImagePath);
    }
}
```

### DropDown Seçme

DropDown seçme işlemlerinde text değerinden seçildiğinde hata alınabilmektedir. Yapılan testlerde value değerinden seçme yapıldı.

```
creditCategorySelectOptionElement.SelectByValue(creditCategorySelectOption);
```
