# 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);
```


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://bekoturko.gitbook.io/yazilim-gelistirme-wiki/test-gelistirme/arayuz-testleri/webdriver-kullanimlari.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
