Użycie biblioteki Selenium do aktualizacji produktów w WooCommerce? Tak, to możliwe…
Selenium to popularna biblioteka służąca do testowania aplikacji internetowych w przeglądarkach. Ale czy można używać jej także w inny sposób? Oczywiście! Selenium automatyzuje przeglądarki i może wykonać praktycznie wszystko, co jesteś w stanie zrobić ręcznie w przeglądarce. Wyobraź sobie, że masz duży sklep internetowy z setkami produktów. Co miesiąc musisz zmieniać ceny. Robienie tego ręcznie to czasochłonna praca. Wykorzystajmy więc Selenium do tego zadania. Możemy napisać prosty skrypt raz i używać go za każdym razem, gdy będzie potrzeba aktualizowania cen.
Ja użyję języka C#, ale Selenium obsługuje także Java, Python, JavaScript, Kotlin czy Ruby. Najpierw musimy zalogować się automatycznie do naszego sklepu przy użyciu Selenium:
IWebDriver driver = new ChromeDriver();
driver.Navigate().GoToUrl("https://yourwebsite.com");
//clicking Rodo Accept
IWebElement searchfieldRODO = driver.FindElement(By.CssSelector("[id='cn-accept-cookie"));
searchfieldRODO.Click();
//admin parts
//logging to WP admin part
IWebElement login = driver.FindElement(By.CssSelector("[id='user_login']"));
string loginentry = "your login";
login.SendKeys(loginentry);
IWebElement password = driver.FindElement(By.CssSelector("[id='user_pass']"));
string passentry = "your password*";
password.SendKeys(passentry);
IWebElement SubmitLogin = driver.FindElement(By.CssSelector("[id='wp-submit']"));
SubmitLogin.Click();
Po zalogowaniu do panelu administratora WordPress (wp-admin), potrzebujemy jeszcze danych do wprowadzenia. Możesz korzystać z różnych formatów danych (np. JSON, dataframe, a nawet Google Sheets…). W tym przypadku użyłem prostej kolekcji generycznej .net List<type>. Moja lista zawiera tablicę stringów – ID produktu oraz cenę.
List<string[]> priceData2 = new List<string[]>();
priceData2.Add(new string[2] { "020z", "475" });
priceData2.Add(new string[2] { "4947", "564" });
priceData2.Add(new string[2] { "04948", "180" });
priceData2.Add(new string[2] { "04949", "036" });
priceData2.Add(new string[2] { "04951", "180" });
priceData2.Add(new string[2] { "4952", "711" });
priceData2.Add(new string[2] { "4953", "092" });
priceData2.Add(new string[2] { "4950", "918" });
priceData2.Add(new string[2] { "I204", "74" });
priceData2.Add(new string[2] { "956", "97" });
priceData2.Add(new string[2] { "04954", "135" });
Potrzebujemy pętli, która będzie iterować po tych danych i aktualizować ceny w WooCommerce. Proste – znajdź produkt po ID i zmień jego cenę. Użyję do tego pętli foreach w C#.
foreach (string[]a in priceData2)
{
IWebElement Products = driver.FindElement(By.CssSelector("[id='menu-posts-product']"));
Products.Click();
IWebElement WszystkieProdukty = driver.FindElement(By.XPath("//*[@id=\"menu-posts-product\"]/ul/li[2]/a")); ;
WszystkieProdukty.Click();
IWebElement ProductSearch = driver.FindElement(By.CssSelector("[id='post-search-input']"));
string productToSearch = a[0];
ProductSearch.SendKeys(productToSearch);
IWebElement SzukaJButton = driver.FindElement(By.CssSelector("[id='search-submit']"));
SzukaJButton.Click();
IWebElement ProductToChange = driver.FindElement(By.ClassName("row-title"));
ProductToChange.Click();
IWebElement PriceField = driver.FindElement(By.CssSelector("[id='_regular_price']"));
string newPrice = a[1];
PriceField.Clear();
PriceField.SendKeys(newPrice);
IWebElement Aktualizuj1 = driver.FindElement(By.CssSelector("[id='publish']"));
WebDriverWait wait = new WebDriverWait(driver, TimeSpan.FromSeconds(2));
wait.Until(d => Aktualizuj1.Enabled);
IJavaScriptExecutor executor = (IJavaScriptExecutor)driver;
executor.ExecuteScript("arguments[0].click();", Aktualizuj1);
}
Po zakończeniu operacji ceny zostaną zaktualizowane. W przykładzie lista jest krótka, ale możesz mieć setki produktów, które będą aktualizowane zdalnie. Na końcu możesz zamknąć przeglądarkę poleceniem Selenium:
public void QuitDrive()
{
driver.Quit();
}
