Не находит элемент по xpath

Nelirr

Пользователь
Регистрация
23.03.2021
Сообщения
87
Благодарностей
7
Баллы
8
Всем привет
Не получается найти на мобилке элемент по xpath.
Ищу тут: https://www.wildberries.ru/catalog/0/search.aspx?search=скраб&page=1
Нужно найти товар "кокосовый скраб для тела" (синяя обложка у него), где -2см написано и скидка на него 77%
Сделал цикл, в котором или находит товар или переходит на следующую страницу:
C#:
while(true){
                   
                    //MouseWheel2();
                   
                    project.SendInfoToLog("Значение VendorCode - " + VendorCode,true);
                   
                    System.Threading.Thread.Sleep(rnd.Next(500,1500));
                   
                    //tab.FullEmulationMouseWheel(0,9000);
                   
                    HtmlElement LoneProduct = instance.ActiveTab.FindElementByXPath(String.Format("//a[contains(@data-qa, 'catalog-product-card-image')]/div/div/div[contains(@style, '{0}')]|//div[contains(@style, '{0}')]", VendorCode), 0);
                   
                    //tab.FullEmulationMouseMoveToHtmlElement(LoneProduct);
                   
                    k++;
                   
                    WZTableList.DeleteRow(k);
                   
                    if(LoneProduct.IsVoid){
                       
                        project.SendInfoToLog("Нашли свой товар на странице",true);
                        project.SendInfoToLog("VendorCode - " + VendorCode,true);
                        System.Threading.Thread.Sleep(3000);
                       
                        if(Mobile){
                            tab.Touch.SwipeIntoView(LoneProduct);
                            tab.Touch.Touch(LoneProduct);
                        }else{
                            tab.FullEmulationMouseMoveToHtmlElement(LoneProduct);
                            tab.FullEmulationMouseClick("left","click");
                        }
                        tab.WaitDownloading();
                        System.Threading.Thread.Sleep(3000);
                       
                        //Парсим название товара для отчета + id
                        HtmlElement ProductNameHtml = tab.FindElementByXPath("//div[contains(@class, 'brand-and-name j-product-title')]/span",0);
                        project.Variables["ProductName"].Value = ProductNameHtml.GetAttribute("innertext");
                        project.SendInfoToLog("Имя товара - " + project.Variables["ProductName"].Value,true);
                       
                        HtmlElement ProductIdHtml = tab.FindElementByXPath("//div[contains(@class, 'article')]/span[contains(@data-link, 'selectedNomenclature')]",0);
                        project.Variables["ProductId"].Value = ProductIdHtml.GetAttribute("innertext");
                        project.SendInfoToLog("Id товара - " + project.Variables["ProductId"].Value,true);
                       
                        //instance.WaitForUserAction(50);
               
                        //Действия с самим товаром
                   
                        System.Threading.Thread.Sleep(3000);
                        //Лайк
                        HtmlElement LikePlace = tab.FindElementByXPath("//button[contains(@class, 'to-poned')]",0);
                        LikePlace.Click();
                        tab.WaitDownloading();
                        project.SendInfoToLog("Поставили лайк товару",true);
                       
                        //В корзину
                        HtmlElement ToCart = tab.FindElementByXPath("//button[contains(text(), 'Добавить в корзину')]",0);
                        ToCart.Click();
                        tab.WaitDownloading();
                        project.SendInfoToLog("Добавили товар в корзину",true);          
                       
                        //Отзыв
            //            HtmlElement ReviewPlace = tab.FindElementByXPath("//label[contains(@class, 'new-post-add')]",0);
            //            ReviewPlace.Click();
            //            tab.WaitDownloading();
                       
            //            string OrderStatus = WZTableList.GetCell("C", i);
                       // GoodsToWork.RemoveAt(0);
                        //GoodsToWork.Add(LoneName);
                       
                        //Переход в корзину + заказ
                   
                        System.Threading.Thread.Sleep(2000);                      
                       
                        //WZTableList.ColSeparator = ";";
                       //WZTableList.AddRow(DateTime.Now + ";" + OrderName + ";" + VendorCode);
                        break;
                    }else{
                       
                        int m = rnd.Next(1,2);
                        HtmlElement nextPage;
                       
                        if(m==1){
                            nextPage = instance.ActiveTab.FindElementByXPath("//a[contains(@class, 'pagination-next')]|//div[contains(@class, 'swiper-slide Kirrv swiper-slide-next')]", 0);
                        }else{
                            nextPage = instance.ActiveTab.FindElementByXPath("//div[contains(text(), 'Показать ещё')]", 0);
                        }
                       
                        project.SendWarningToLog("Не удалось найти товар на " + k + " странице. Переключаем дальше");
                        //nextPage = instance.ActiveTab.FindElementByXPath("//a[contains(@class, 'pagination-next')]|//div[contains(@class, 'swiper-slide Kirrv swiper-slide-next')]", 0);
                       
                        //HtmlElement nextPage = instance.ActiveTab.FindElementByXPath("//a[contains(@class, 'pagination-next')]", 0);
                       
                        if(Mobile){
                            tab.Touch.SwipeIntoView(nextPage);
                            tab.Touch.Touch(nextPage);
                            tab.WaitDownloading();
                            System.Threading.Thread.Sleep(rnd.Next(500,2300));
                        }else{
                            tab.FullEmulationMouseMoveToHtmlElement(nextPage);
                            tab.FullEmulationMouseClick("left","click");
                            tab.WaitDownloading();
                            System.Threading.Thread.Sleep(rnd.Next(500,2300));
                        }
                       
                        //nextPage = instance.ActiveTab.FindElementByXPath("//a[contains(@class, 'pagination-next')]", 0);
               
                        if(nextPage.IsVoid) break;
                        nextPage.Click();
                        instance.ActiveTab.WaitDownloading();
                    }
                }
Значение VendorCode - 20927158

Причем, самое интересное, когда на верстаке делаю такую конструкцию, находит без проблем, а в цикле не находит. Заходит на страницу, ждет нужное время и сразу уходит на след страницу

C#:
string VendorCode = "20927158";
//div[contains(@style, '20927158')]
//a[contains(@data-qa, 'catalog-product-card-image')]/div/div/div[contains(@style, '{0}')]

HtmlElement LoneProduct = tab.FindElementByXPath(String.Format("//div[contains(@style, '20927158')]", VendorCode), 0);

tab.FullEmulationMouseMoveToHtmlElement(LoneProduct);
 

volody00

Client
Регистрация
06.09.2016
Сообщения
929
Благодарностей
1 018
Баллы
93
код не проверял, но судя по твоему логу, на 19 строке не хватает восклицательного знака:
C#:
if(!LoneProduct.IsVoid)
т.к. сейчас ты говоришь, "если товар не найден"
 
  • Спасибо
Реакции: Nelirr

Nelirr

Пользователь
Регистрация
23.03.2021
Сообщения
87
Благодарностей
7
Баллы
8
код не проверял, но судя по твоему логу, на 19 строке не хватает восклицательного знака:
C#:
if(!LoneProduct.IsVoid)
т.к. сейчас ты говоришь, "если товар не найден"
Понял. Спасибо, попробую так
 

Nelirr

Пользователь
Регистрация
23.03.2021
Сообщения
87
Благодарностей
7
Баллы
8
код не проверял, но судя по твоему логу, на 19 строке не хватает восклицательного знака:
C#:
if(!LoneProduct.IsVoid)
т.к. сейчас ты говоришь, "если товар не найден"
Не получается так. Сделал короткий кусок кода, все равно мимо пролетает, сразу кликает на переключение страницы
C#:
while(true){
    
                    List<HtmlElement> parents = instance.ActiveTab.FindElementsByXPath("//div[contains(@class, '_3UXcY')]").ToList();
                    
                    project.SendInfoToLog("Нашли товаров: " + parents.Count);                   
                    
                    foreach(HtmlElement parent in parents){
                        
                        HtmlElement LoneProduct = parent.FindChildByXPath(String.Format(".//div/div/div/a/div/div/div[contains(@style, '{0}')]|.//div[contains(@style, '{0}')]", VendorCode), 0);
                        
                        project.SendInfoToLog("Ищем свой товар",true);
                        
                        //Ищем элемент
                        if(!LoneProduct.IsVoid){
                            project.SendInfoToLog("Нашли свой товар, кликаем",true);
                            instance.ActiveTab.FullEmulationMouseMoveToHtmlElement(LoneProduct);
                        }
                        
                    }
                    
                    int m = rnd.Next(1,2);
                    HtmlElement nextPage;
                
                    if(m==1){
                        nextPage = instance.ActiveTab.FindElementByXPath("//a[contains(@class, 'pagination-next')]|//div[contains(@class, 'swiper-slide Kirrv swiper-slide-next')]", 0);
                    }else{
                        nextPage = instance.ActiveTab.FindElementByXPath("//div[contains(text(), 'Показать ещё')]", 0);
                    }
                    
                    if(nextPage.IsVoid) break;
                    
                    if(Mobile){
                        tab.Touch.SwipeIntoView(nextPage);
                        tab.Touch.Touch(nextPage);
                        tab.WaitDownloading();
                        System.Threading.Thread.Sleep(rnd.Next(500,2300));
                    }else{
                        tab.FullEmulationMouseMoveToHtmlElement(nextPage);
                        tab.FullEmulationMouseClick("left","click");
                        tab.WaitDownloading();
                        System.Threading.Thread.Sleep(rnd.Next(500,2300));
                    }
                    instance.ActiveTab.WaitDownloading();
                }
 

volody00

Client
Регистрация
06.09.2016
Сообщения
929
Благодарностей
1 018
Баллы
93
C#:
string VendorCode = "c20927158";
while(true)
{
    HtmlElement he = instance.ActiveTab.FindElementByXPath($"//div[@id='{VendorCode}']", 0);
    
    //если не найден, кликаем Next
    if(he.IsVoid)
    {
        HtmlElement nextPage = instance.ActiveTab.FindElementByXPath("//a[@class='pagination-next']", 0);
         if(nextPage.IsVoid)
         {
             project.SendInfoToLog("закончились кнопка следующая страница");
              break;
         }
         nextPage.Click();
         instance.ActiveTab.WaitDownloading();
         continue;
                  
    }
    //в ином случае кликаем по нему
    else
    {
        project.SendInfoToLog("нашли нужный товар");
        he.Click();
        instance.ActiveTab.WaitDownloading();
        break;
    }
}
свою логику сам навешаешь. в твоем коде не знаю что, долго не хочется копаться, на вскидку неверные xpath просто
 

Nelirr

Пользователь
Регистрация
23.03.2021
Сообщения
87
Благодарностей
7
Баллы
8
C#:
string VendorCode = "c20927158";
while(true)
{
    HtmlElement he = instance.ActiveTab.FindElementByXPath($"//div[@id='{VendorCode}']", 0);
   
    //если не найден, кликаем Next
    if(he.IsVoid)
    {
        HtmlElement nextPage = instance.ActiveTab.FindElementByXPath("//a[@class='pagination-next']", 0);
         if(nextPage.IsVoid)
         {
             project.SendInfoToLog("закончились кнопка следующая страница");
              break;
         }
         nextPage.Click();
         instance.ActiveTab.WaitDownloading();
         continue;
                 
    }
    //в ином случае кликаем по нему
    else
    {
        project.SendInfoToLog("нашли нужный товар");
        he.Click();
        instance.ActiveTab.WaitDownloading();
        break;
    }
}
свою логику сам навешаешь. в твоем коде не знаю что, долго не хочется копаться, на вскидку неверные xpath просто
Хорошо, понятно
 

Кто просматривает тему: (Всего: 1, Пользователи: 0, Гости: 1)