using OpenQA.Selenium;
//不同瀏覽器有不同的 nuget library 與 namespace
using OpenQA.Selenium.Chrome;

string fullUrl = "https://tw.stock.yahoo.com/class-quote?sectorId=26&exchange=TAI"; 
 
var options = new ChromeOptions(); 
//使用 headless 模式
options.AddArguments(new List<string>() { 
    "headless", 
    "disable-gpu" 
}); 
 
//使用 ChromeDriver
var browser = new ChromeDriver(options); 
browser.Navigate().GoToUrl(fullUrl);
//使用 css selector 找到所有股票資訊
var nodes = browser.FindElements(By.CssSelector("li[class='List(n)']"));

var stocks = nodes.Select(a => new Stock
{
    //使用 XPath 找到股票名稱、代號、價格、漲跌、漲跌幅、開盤、昨收、最高、最低、成交量
    Name = a.FindElement(By.XPath("./div/div[1]/div[2]/div/div[1]")).Text.Trim(),
    Symbol =  a.FindElement(By.XPath("./div/div[1]/div[2]/div/div[2]")).Text.Trim(),
    Price =  a.FindElement(By.XPath("./div/div[2]")).Text.Trim(),
    Change = a.FindElement(By.XPath("./div/div[3]")).Text.Trim(),
    PriceChange = a.FindElement(By.XPath("./div/div[4]")).Text.Trim(),
    Open = a.FindElement(By.XPath("./div/div[5]")).Text.Trim(),
    LastClose = a.FindElement(By.XPath("./div/div[6]")).Text.Trim(),
    High = a.FindElement(By.XPath("./div/div[7]")).Text.Trim(),
    Low = a.FindElement(By.XPath("./div/div[8]")).Text.Trim(),
    Turnover = a.FindElement(By.XPath("./div/div[9]")).Text.Trim(),
    UpDown = UpDownCheck(a.FindElement(By.XPath("./div/div[3]/span")).GetAttribute("class"))
});

foreach(var stock in stocks) 
{
    Console.WriteLine($"股票名稱: {stock.Name.PadRight(12)}\t 股票代號: {stock.Symbol}\t 股價: {stock.Price.PadRight(5)}\t 漲跌: {stock.UpDown} {stock.PriceChange.PadRight(8)}\t 漲跌幅: {stock.UpDown} {stock.Change.PadRight(8)}\t 開盤: {stock.Open}\t 昨收: {stock.LastClose}\t 最高: {stock.High}\t 最低: {stock.Low}\t 成交量(張): {stock.Turnover}");
} 

string UpDownCheck(string value)
{
    if (value.Contains("up"))
    {
        return "上漲";
    }
    if (value.Contains("down"))
    {
        return "下跌";
    }
    return string.Empty;
}

class Stock
{
    public string Name { get; set; }
    public string Symbol { get; set; }
    public string Price { get; set; }
    public string Change { get; set; }
    public string PriceChange { get; set; }
    public string Open { get; set; }
    public string LastClose { get; set; }
    public string High { get; set; }
    public string Low { get; set; }
    public string Turnover { get; set; }
    public string UpDown { get; set; }
}