GUI (Grafiksel Kullanıcı Arayüzü)
chromedp (Web Driver)
Chromedp paketi, harici bağımlılıklar (Selenium veya PhantomJS gibi) olmadan Go'da Chrome DevTools Protokolünü destekleyen tarayıcıları çalıştırmanın daha hızlı ve daha basit bir yoludur. Harici bağımlılık yoktur derken, tabi ki sisteminizde Google Chrome'un yüklü olması gerekiyor. Chromedp'ye headless modu gerektiği için minimum Chrome sürümünüz 59 olması gerekiyor.

Paketi yüklemek için:

go get -u github.com/chromedp/chromedp

Örnek.1

1
package main
2
3
import (
4
"context"
5
"log"
6
7
"github.com/chromedp/chromedp"
8
)
9
10
func main() {
11
//chrome örneği oluşturalım
12
ctx, cancel := chromedp.NewExecAllocator(
13
context.Background(),
14
append(
15
chromedp.DefaultExecAllocatorOptions[:],
16
chromedp.Flag("headless", false),
17
)...,
18
)
19
//headless: false ayarlayarak pencerenin görünmesini istedik
20
21
//chrome nesnesini defer ile kapatmayı unutmuyoruz
22
defer cancel()
23
24
//yeni durum oluşturuyoruz
25
ctx, cancel = chromedp.NewContext(ctx)
26
27
//aynı şekilde defer ile penceremizide kapatıyoruz
28
defer cancel()
29
30
//Twitter isminin kaydedileceği değişkeni oluşturalım
31
var twitterName string
32
33
//chromedp.Run() içerisinde tarayıcıda yapılacak işlemleri yazıyoruz.
34
err := chromedp.Run(ctx, //önce durumu (hangi pencere) olacağını belirtiyoruz
35
36
//tarayıcının gitmsini istediğimiz adresi yazalım
37
chromedp.Navigate(`https://kaanksc.com/posts/webview-statik-uygulama-ornegi3/`),
38
39
//css seçici ile belirttiğimiz elementin yüklenmesini bekleyelim
40
chromedp.WaitVisible(`.single__contents > p:nth-child(16) > a:nth-child(1)`, chromedp.ByQuery),
41
42
//Tıklanılacak nesneyi yine css seçici ile belirtelim
43
chromedp.Click(`.single__contents > p:nth-child(16) > a:nth-child(1)`, chromedp.ByQuery),
44
//Bu işlemden sonra twitter'a gidecek
45
46
//Twitter profilinde adın gösterildiği yeri css seçici ile beklemesini istedik
47
chromedp.WaitVisible(`div.r-1b6yd1w:nth-child(1) > span:nth-child(1)`, chromedp.ByQuery),
48
49
//belirttiğimiz css seçicisi ile elementin içindeki yazıyı twitterName değişkenine atayalım
50
chromedp.Text(`div.r-1b6yd1w:nth-child(1) > span:nth-child(1)`, &twitterName),
51
52
//burdan sonra tarayıcı penceresi kapanacak
53
)
54
55
//hata kontrolü yapaım
56
if err != nil {
57
log.Fatal(err)
58
}
59
60
//son olarak twitterName içindeki değişkeni ekrana bastıralım
61
log.Printf("Twitter İsim:%s\n", twitterName)
62
}
63
Copied!
Yukarıdaki örnekte yeni chrome penceresi oluşturma, tıklama, elementin yüklenmesini bekleme, element içindeki yazıyı alma ve adrese gitme gibi işlemlerin nasıl yapıldığını gördük.

Örnek.2

Go Playground linkinden Go kodlarını çeken bir uygulama yazalım.
1
package main
2
3
import (
4
"context"
5
"log"
6
7
"github.com/chromedp/chromedp"
8
)
9
10
func main() {
11
//chrome örneği oluşturalım
12
ctx, cancel := chromedp.NewExecAllocator(
13
context.Background(),
14
append(
15
chromedp.DefaultExecAllocatorOptions[:],
16
chromedp.Flag("headless", true), //Bu sefer headless çalışmasını istedik
17
//yani chrome pecneresi açılmayacak
18
)...,
19
)
20
21
//chrome nesnesini defer ile kapatmayı unutmuyoruz
22
defer cancel()
23
24
//yeni durum oluşturuyoruz
25
ctx, cancel = chromedp.NewContext(ctx)
26
27
//aynı şekilde defer ile penceremizide kapatıyoruz
28
defer cancel()
29
30
//go Kodlarının kaydedileceği değişkeni oluşturalım
31
var goKodu string
32
33
//chromedp.Run() içerisinde tarayıcıda yapılacak işlemleri yazıyoruz.
34
err := chromedp.Run(ctx, //önce durumu (hangi pencere) olacağını belirtiyoruz
35
36
//tarayıcının gitmsini istediğimiz adresi yazalım
37
chromedp.Navigate(`https://play.golang.org/p/a_SoTzENmV7`),
38
39
//tarayıcının yüklenemesini bekleyeceği elementi css seçici ile yazıyoruz
40
chromedp.WaitVisible(`#code`, chromedp.ByQuery),
41
42
//textContent ile yazı alanı içeriğini çekebiliriz.
43
chromedp.TextContent(`#code`, &goKodu, chromedp.ByQuery),
44
)
45
46
if err != nil {
47
log.Fatal(err)
48
}
49
50
//son oalrak go kodlarını ekrana bastıralım
51
log.Printf("Go Kodu:\n%s", goKodu)
52
}
53
Copied!
Yukarıdaki örnekte headless modda çalışmayı ve yazı kutusu (input veya textarea) içindeki yazıları almayı öğrendik.
Daha fazla bilgi için https://github.com/chromedp/chromedp,
daha fazla örnek için https://github.com/chromedp/examples adresine bakabilirsiniz.
Last modified 1yr ago
Copy link