# Selenium

## 🗽 Açıklama <a href="#aciklama" id="aciklama"></a>

* Selenium'un python dokümantasyonu için [buraya](https://selenium-python.readthedocs.io/index.html) bakabilirsin
  * İtici bir dokümantasyon arıyorsan [buraya](https://seleniumhq.github.io/selenium/docs/api/py/api.html) bakabilirsin 😒

> **Python** dili ve **Chromedriver** baz alınmıştır.

## Seleinium Kurulumu <a href="#seleinium-kurulumu" id="seleinium-kurulumu"></a>

Selenium tarayıcı driver'ı kullanarak çalışmaktadır

* ChromeDriver'ı [buradan](http://chromedriver.chromium.org/) indirin
* ChromeDriver'ınızı uygun bir konuma koyun, ileride yol verisi selenium'a aktarılacaktır

> Projenizin içerisinde `utils` dizini açıp içine `chromedriver` adlı dosyayı atabilirsiniz, ileride bu şekilde değerlendirilecektir

### Conda Üzerinden Kurulum <a href="#conda-uezerinden-kurulum" id="conda-uezerinden-kurulum"></a>

Selenium için özel ortam oluştururak kurulum yapmak daha sağlıklıdır.

```
conda create -n selenium selenium
```

> Kurulum sonrasında ortamı `conda activate selenium` ile aktif etmeyi unutmayın.

## Chromedriver'ı Yapılandırma <a href="#chromedriveri-yapilandirma" id="chromedriveri-yapilandirma"></a>

### Arayüz Olmadan Chromedriver'ı Kullanma (İsteğe Bağlı) <a href="#arayuez-olmadan-chromedriveri-kullanma-istege-bagli" id="arayuez-olmadan-chromedriveri-kullanma-istege-bagli"></a>

Selenium aracı chrome üzerinde çeşitli özelliklerle çalışabilmekte (örn: arayüz olmadan, sessizce çalışabilir)

> ​[Google colab](https://colab.research.google.com/) üzerinde kullanmak istersen bu ayarlar zorunludur, kaynağa [buradan](https://stackoverflow.com/a/54077842) erişebilirsin.

```
options = webdriver.ChromeOptions()options.add_argument('--headless')options.add_argument('--no-sandbox')options.add_argument('--disable-gpu')options.add_argument('--disable-setuid-sandbox')
```

### Chromedriver'ı oluşturma <a href="#chromedriveri-olusturma" id="chromedriveri-olusturma"></a>

Chromedriver öğesini oluşturmak için alttaki yapıyı kullanmak zorundayız:

> Tüm işlemleri oluşturduğumuz `driver` objesi ile yapmaktayız.

```
from selenium import webdriver​driver = webdriver.Chrome(    executable_path=<chromedriver_yolu>,    options=<ek_ayarlar>)
```

* `<chromedriver_yolu>` Chromedriver dosyasının yolu
  * Örn: `"utils/chromedriver"`
* `<ek_ayarlar>` Ek yapılandırma ayarları (İsteğe bağlı)
  * Örn: Yukarıdaki alanda tanımlanan `options` objesi

### Websitesine Erişme <a href="#websitesine-erisme" id="websitesine-erisme"></a>

* `<URL>` Girmek istediğimiz sitenin adresi
  * Örn: `"www.yemreak.com"`

### Websitesinde Eleman Bulma <a href="#websitesinde-eleman-bulma" id="websitesinde-eleman-bulma"></a>

Kullanım şekli `driver.<eleman_bulma_metodu>` şeklindedir.

> Kaynak için [buraya](https://selenium-python.readthedocs.io/locating-elements.html#locating-elements) bakabilirsin.

* find\_element\_by\_id
* find\_element\_by\_name
* find\_element\_by\_xpath
* find\_element\_by\_link\_text
* find\_element\_by\_partial\_link\_text
* find\_element\_by\_tag\_name
* find\_element\_by\_class\_name
* find\_element\_by\_css\_selector

#### Websitesinde Çoklu Eleman Bulma <a href="#websitesinde-coklu-eleman-bulma" id="websitesinde-coklu-eleman-bulma"></a>

* find\_elements\_by\_name
* find\_elements\_by\_xpath
* find\_elements\_by\_link\_text
* find\_elements\_by\_partial\_link\_text
* find\_elements\_by\_tag\_name
* find\_elements\_by\_class\_name
* find\_elements\_by\_css\_selector

### Websitesine İçerik Bekleyerek Erişme <a href="#websitesine-icerik-bekleyerek-erisme" id="websitesine-icerik-bekleyerek-erisme"></a>

Bazen websiteleriindeki içerikler yüklenmeden işlem yapmak istemeyiz. Bunun için `WebDriverWait` objesini kullanmaktayız.

**Temel kullanım:**

```
from selenium.webdriver.common.by import Byfrom selenium.webdriver.support import expected_conditions as ECfrom selenium.webdriver.support.ui import WebDriverWait​WebDriverWait(driver, <bekleme_süresi>).<bekleme_şekli>(    EC.<koşul>(<tanımlayıcı>))
```

* `<bekleme_süresi>` En uzun bekleme süresi. Eğer bu vakte kadar istenen sağlanmazsa hata fırlatır (TimoutException)
  * Örn: `10` 10 saniye bekler, koşul sağlanmazsa hata fırlatır
* `<bekleme_şekli>` Koşul olana kadar ya da olmayana kadar bekleme
  * `until` Koşul olana kadar bekle
  * `until_not` Koşul olmayana kadar bekle
* `<koşul>` Selenium'a özgü bekleme koşulu
  * Selenium koşullarının listesine [buradan](https://selenium-python.readthedocs.io/waits.html) erişebilirsin.
  * Selenium bekleme koşullarının detayı için [buraya](https://seleniumhq.github.io/selenium/docs/api/py/webdriver_support/selenium.webdriver.support.expected_conditions.html?highlight=expected_conditions) bakabilirsin.
  * Örn: `presence_of_element_located` Eleman oluşana kadar bekleme

> Tüm işlemler `try` - `except` bloğu arasında yapılamlıdır, aksi takdirde ufak sorunlarda programınız kapanacaktır.

#### Eleman Oluşana Kadar Bekleme <a href="#eleman-olusana-kadar-bekleme" id="eleman-olusana-kadar-bekleme"></a>

```
from selenium.webdriver.common.by import Byfrom selenium.webdriver.support import expected_conditions as ECfrom selenium.webdriver.support.ui import WebDriverWait​try:    driver.get(config.URL) ​    WebDriverWait(driver, 10).until(        EC.presence_of_element_located((By.ID, "yemreak"))    )​    WebDriverWait(driver, 10).until(        EC.presence_of_element_located((By.CLASS_NAME, "active"))    )​    WebDriverWait(driver, 10).until(        EC.presence_of_element_located((By.CSS_SELECTOR, "div.yemreak"))    )finally:    driver.close() 
```

## Websitesinde Javascript Derleme <a href="#websitesinde-javascript-derleme" id="websitesinde-javascript-derleme"></a>

Javascript'i `driver.execute_script("<script>")` metodu ile derleyebilirsin.

* `<script>` Javascript metni

### Dosyadan Javascript Derleme <a href="#dosyadan-javascript-derleme" id="dosyadan-javascript-derleme"></a>

Dosyada javascript derlemek için dosyayı `jsmin` modülü ile **minify** etmen gerekmektedir.

```
from jsmin import jsmin​def minify(file_path):    """ Dosyayı minify etme    """    with open(file_path) as js_file:        return jsmin(js_file.read(), quote_chars="'\"`")​driver.execute_script(minify(<dosya_yolu>))
```

* `<dosya_yolu>` Minify edilecek ve derlenecek dosyanın yolu
  * Örn: `javascripts/yemreak.js`

### Javascript İşlemleri <a href="#javascript-islemleri" id="javascript-islemleri"></a>

Javascript için önemli notlar:

* Javascript objelerinin tanımlanması için `window.` ön eki ile yapman gerekmekte, aksi takdirde selenium içerisinde kullanamazsın.
  * Objeleri kullanırken `window.` ön ekini kullanmana gerek yoktur.
* Javascript verilerini python koduna almak için scriptine `return` anahtar kelimesi eklemen gerekmektedir.

```
window.temp = () => {    console.log("Yemreak")}​window.deger = 5​function calismas() {    console.log("Bu metodu selenium bulamaz")}
```

```
driver.execute_script(minify("main.js"))) driver.execute_script("temp()") driver.execute_script("calismaz()") driver.execute_script("return deger") 
```

## Harici Bağlantılar <a href="#harici-baglantilar" id="harici-baglantilar"></a>

* [Colab üzerinden selenium kullanmak](https://stackoverflow.com/a/54077842)
* [Selenium Örnekleri](https://www.seleniumhq.org/docs/03_webdriver.jsp)


---

# 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://docs.yemreak.com/arsiv/web/selenium.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.
