Смотрите видео ниже, чтобы узнать, как установить наш сайт в качестве веб-приложения на домашнем экране.
Примечание: Эта возможность может быть недоступна в некоторых браузерах.
Вы используете устаревший браузер. Этот и другие сайты могут отображаться в нём некорректно. Вам необходимо обновить браузер или попробовать использовать другой.
Какое количество языков используется? Если всего 2 то можно сделать сравнение двух вариантов. Значение класса, которое сейчас срабатывает, выглядит не постоянным и может перестать работать. Вам нужно зацепиться за что-то более стабильное. Если вы хотите нажать кнопку "Далее" на первом экране, то там есть div с id. Вот попробуйте для примера такой путь //div[@id='identifierNext']/descendant::span
Какое количество языков используется? Если всего 2 то можно сделать сравнение двух вариантов. Значение класса, которое сейчас срабатывает, выглядит не постоянным и может перестать работать. Вам нужно зацепиться за что-то более стабильное. Если вы хотите нажать кнопку "Далее" на первом экране, то там есть div с id. Вот попробуйте для примера такой путь //div[@id='identifierNext']/descendant::span
Языков по непонятной причине много, не 2. Хотя использую только ру прокси, но периодически появляются разные языки, начиная от английского и заканчивая вообще непойми каким. Но при входе через кубик, вышеуказанное значение класса всегда одно и тоже, осечек не было. Не пойму только, почему через кубик это значение всегда находится без проблем, а с помощью кода на находится вообще никак, ни через class, ни через text.
Всем привет)
Накатал код для работы с гуглом. Можете помочь разобраться, где какие ошибки возникают?
Только осваиваю c# )
Ошибки такие:
Ошибка в действии "CS1501" "Ни одна из перегрузок метода "FindElementByXPath" не принимает "1" аргументов". [Строка: 16; Cтолбец: 41]
Ошибка в действии "CS1501" "Ни одна из перегрузок метода "FindElementByXPath" не принимает "1" аргументов". [Строка: 21; Cтолбец: 48]
Ошибка в действии "CS1501" "Ни одна из перегрузок метода "FullEmulationMouseMoveAboveHtmlElement" не принимает "1" аргументов". [Строка: 21; Cтолбец: 4]
Ошибка в действии "CS0246" "Не удалось найти имя типа или пространства имен "HmtlElement" (пропущена директива using или ссылка на сборку?)". [Строка: 31; Cтолбец: 3]
Что должен делать:
Предварительно заходим в гугл по нужному запросу, дальше работает этот код:
1. Ищем нужный домен на заданном количестве страниц (задается в настройках pages_c)
2. Если не нашли на первой, перелистываем стр дальше, пока
3. не найдем или пока не закончатся стр
все.
C#:
var rnd = new Random();
Tab tab1 = instance.ActiveTab;
string targetDomain = project.Variables["target_domain"].Value;
if (String.IsNullOrWhiteSpace(targetDomain)){
return "Имя домена не может быть пустой строкой..";
}
project.SendInfoToLog(String.Format("Переходим на сайт {0}", targetDomain), true);
string targetXPath = String.Format("//a[@id='pnnext']/span[2]", targetDomain);
int serpPagesLimit = Int32.Parse(project.Variables["pages_c"].Value);
HtmlElement ClickPosition = null;
for(int currentSerpPage = 1; currentSerpPage <= serpPagesLimit; currentSerpPage++){
project.SendInfoToLog(String.Format("Начинаем с №{0} страницы выдачи", currentSerpPage), true);
HtmlElemntCollection domainPosition = tab1.FindElementByXPath(String.Format("//h3[@class='LC20lb']", targetDomain));
if(domainPosition.Count==0) {
project.SendInfoToLog(String.Format("Не нашли домен на 1й странице выдачи", targetDomain, currentSerpPage), true);
}
else{
tab1.FullEmulationMouseMoveAboveHtmlElement(tab1.FindElementByXPath(String.Format("//h3[@class='LC20lb']", targetDomain)));
Thread.Sleep(rnd.Next(120, 320));
tab1.FullEmulationMouseClick("left", "click");
Thread.Sleep(4000);
tab1 = instance.GetTabByAddress("popup");
tab1.WaitDownloading();
}
HmtlElement elemNext = tab1.FindElementByXPath("//a[@id='pnnext']/span[2]", 0);
if(elemNext.IsVoid) {
project.SendInfoToLog("Не найдена ссылка 'Следующая' в поиске..", true);
break;
}
tab1.FullEmulationMouseMoveToHtmlElement(elemNext);
Thread.Sleep(rnd.Next(120, 340));
tab1.FullEmulationMouseClick("left","click");
tab1.WaitDownloading();
}
Всем привет)
Накатал код для работы с гуглом. Можете помочь разобраться, где какие ошибки возникают?
Только осваиваю c# )
Ошибки такие:
Ошибка в действии "CS1501" "Ни одна из перегрузок метода "FindElementByXPath" не принимает "1" аргументов". [Строка: 16; Cтолбец: 41]
Ошибка в действии "CS1501" "Ни одна из перегрузок метода "FindElementByXPath" не принимает "1" аргументов". [Строка: 21; Cтолбец: 48]
Ошибка в действии "CS1501" "Ни одна из перегрузок метода "FullEmulationMouseMoveAboveHtmlElement" не принимает "1" аргументов". [Строка: 21; Cтолбец: 4]
Ошибка в действии "CS0246" "Не удалось найти имя типа или пространства имен "HmtlElement" (пропущена директива using или ссылка на сборку?)". [Строка: 31; Cтолбец: 3]
Что должен делать:
Предварительно заходим в гугл по нужному запросу, дальше работает этот код:
1. Ищем нужный домен на заданном количестве страниц (задается в настройках pages_c)
2. Если не нашли на первой, перелистываем стр дальше, пока
3. не найдем или пока не закончатся стр
все.
C#:
var rnd = new Random();
Tab tab1 = instance.ActiveTab;
string targetDomain = project.Variables["target_domain"].Value;
if (String.IsNullOrWhiteSpace(targetDomain)){
return "Имя домена не может быть пустой строкой..";
}
project.SendInfoToLog(String.Format("Переходим на сайт {0}", targetDomain), true);
string targetXPath = String.Format("//a[@id='pnnext']/span[2]", targetDomain);
int serpPagesLimit = Int32.Parse(project.Variables["pages_c"].Value);
HtmlElement ClickPosition = null;
for(int currentSerpPage = 1; currentSerpPage <= serpPagesLimit; currentSerpPage++){
project.SendInfoToLog(String.Format("Начинаем с №{0} страницы выдачи", currentSerpPage), true);
HtmlElemntCollection domainPosition = tab1.FindElementByXPath(String.Format("//h3[@class='LC20lb']", targetDomain));
if(domainPosition.Count==0) {
project.SendInfoToLog(String.Format("Не нашли домен на 1й странице выдачи", targetDomain, currentSerpPage), true);
}
else{
tab1.FullEmulationMouseMoveAboveHtmlElement(tab1.FindElementByXPath(String.Format("//h3[@class='LC20lb']", targetDomain)));
Thread.Sleep(rnd.Next(120, 320));
tab1.FullEmulationMouseClick("left", "click");
Thread.Sleep(4000);
tab1 = instance.GetTabByAddress("popup");
tab1.WaitDownloading();
}
HmtlElement elemNext = tab1.FindElementByXPath("//a[@id='pnnext']/span[2]", 0);
if(elemNext.IsVoid) {
project.SendInfoToLog("Не найдена ссылка 'Следующая' в поиске..", true);
break;
}
tab1.FullEmulationMouseMoveToHtmlElement(elemNext);
Thread.Sleep(rnd.Next(120, 340));
tab1.FullEmulationMouseClick("left","click");
tab1.WaitDownloading();
}
tab1.FullEmulationMouseMoveAboveHtmlElement(tab1.FindElementByXPath(String.Format("//h3[@class='LC20lb']", targetDomain))); Thread.Sleep(rnd.Next(120, 320)); проблема в том, что у гугла при каждом обновлении будет изменятся xPath, когда ты писал код было //h3[@class='LC20lb обновляешь страницу и он меняется, изза этого у тебя ошибки.
tab1.FullEmulationMouseMoveAboveHtmlElement(tab1.FindElementByXPath(String.Format("//h3[@class='LC20lb']", targetDomain))); Thread.Sleep(rnd.Next(120, 320)); проблема в том, что у гугла при каждом обновлении будет изменятся xPath, когда ты писал код было //h3[@class='LC20lb обновляешь страницу и он меняется, изза этого у тебя ошибки.
Неправильно классы брал. Чтобы проверить код, сократил до самой сути)
В итоге так получается:
C#:
var rnd = new Random();
Tab tab1 = instance.ActiveTab;
var post = tab1.FindElementByAttribute("cite", "class", project.Variables["target_domain"].Value, "regexp", 0);//находим элемент
//Если не находим домен, выходим по красной ветке
if (post.Count==0) throw new Exception ("Сайт не найден на " + project.Variables["pages_c1"].Value + " странице поисковой выдачи");
project.SendInfoToLog(String.Format("Переходим на сайт {0}", post), true);
tab1.FullEmulationMouseMoveToHtmlElement(post);
Thread.Sleep(500);
tab1.FullEmulationMouseClick("left","click");
Ошибочка. Вот так верно:
//Если не находим домен, выходим по красной ветке
if (posts == null) throw new Exception ("Сайт не найден на " + project.Variables["pages_c1"].Value + " странице поисковой выдачи");
Извиняюсь за тупость, что нужно прописать в этом коде, чтоб если не находило сайт, выходило по красной ветке? А то, в любом случае, выходит по зелёной.
HtmlElement he = instance.ActiveTab.FindElementByAttribute("a", "href", (project.Variables["domen"].Value), "regexp", 0);//находим элемент по УРЛу
instance.ActiveTab.FullEmulationMouseMoveToHtmlElement(he);//двигаем мышку к нему
System.Threading.Thread.Sleep(500);//ждем пол секунды перед нажатием
instance.ActiveTab.FullEmulationMouseClick("left", "click");//ЛКМ по ссылке
Вроде сделал. Нашол ответ здесь на форуме. Может кому пригодится:
HtmlElement he = instance.ActiveTab.FindElementByAttribute("a", "href", (project.Variables["site"].Value), "regexp", 0);//находим элемент по УРЛу
instance.ActiveTab.FullEmulationMouseMoveToHtmlElement(he);//двигаем мышку к нему
System.Threading.Thread.Sleep(500);//ждем пол секунды перед нажатием
if (he.IsVoid) throw new Exception("Не найдено и т.д."); // их всегда надо проверять
he.Click();
instance.ActiveTab.FullEmulationMouseClick("left", "click");//ЛКМ по ссылке
работает до первого сбоя в браузере. а они очень часто происходят.
вот так правильно
C#:
if ((instance.ActiveTab.IsVoid) || (instance.ActiveTab.IsNull)) throw new Exception("Не найдено вкладки");
HtmlElement he = instance.ActiveTab.FindElementByAttribute("a", "href", (project.Variables["site"].Value), "regexp", 0);//находим элемент по УРЛу
if (he.IsVoid) throw new Exception("Не найдено и т.д."); // их всегда надо проверять
instance.ActiveTab.FullEmulationMouseMoveToHtmlElement(he);//двигаем мышку к нему
System.Threading.Thread.Sleep(500);//ждем пол секунды перед нажатием
instance.ActiveTab.FullEmulationMouseClick("left", "click");//ЛКМ по ссылке
работает до первого сбоя в браузере. а они очень часто происходят.
вот так правильно
C#:
if ((instance.ActiveTab.IsVoid) || (instance.ActiveTab.IsNull)) throw new Exception("Не найдено вкладки");
HtmlElement he = instance.ActiveTab.FindElementByAttribute("a", "href", (project.Variables["site"].Value), "regexp", 0);//находим элемент по УРЛу
как зачем ? а если сбой в браузере ? она к примеру нулевая , код к ней обращается и вот тут хорошо если это просто сбой, а если браузер завис ? в первом случае проект по BAD END выйдет, а во втором случае получаешь зависший поток.... и к куче сообщений на форуме прибавиться твое , а что делать с зависшим шаблоном
как зачем ? а если сбой в браузере ? она к примеру нулевая , код к ней обращается и вот тут хорошо если это просто сбой, а если браузер завис ? в первом случае проект по BAD END выйдет, а во втором случае получаешь зависший поток.... и к куче сообщений на форуме прибавиться твое , а что делать с зависшим шаблоном
Код не много не причесан, прошу понять и простить.
Подробная инструкция в коде - в комментариях.
Кратко: - вызываем из кубика FullEmulMoveToCenterOfElm - прописываем, все что подсказывает компилятор и радуемся жизни. )
C#:
/// <summary>
/// rnd - Случайное число в диапазоне от start до end
/// </summary>
/// <param name="start">Меньшее число</param>
/// <param name="end">Большее число</param>
/// <returns>Число</returns>
public static int rnd (int start=0, int end=100) {
Random rnd = new Random();
return rnd.Next(start, end);
}
/// <summary>
/// Двигает мышь к центру элемента методом FullEmulationMouseMove, с некоторым смещением
/// </summary>
/// <param name="instance">Инстанс</param>
/// <param name="targetElem"> Целевой HtmlElement</param>
/// <param name="deltaZero"> При true двигает точно к центру элемента, иначе к точке, которая смещена от центра элемента на случайное расстояние </param>
/// <param name="click"> Кликает на элементе если true, default - false </param>
/// <returns></returns>
public static void FullEmulMoveToCenterOfElm(Instance instance, ZennoLab.CommandCenter.HtmlElement targetElem, bool deltaZero = false, bool click = false){
Tab tab = instance.ActiveTab;
int windheight = int.Parse(tab.MainDocument.EvaluateScript("return window.innerWidth;"));
Point xyhe = targetElem.DisplacementInBrowser;
Point curXY = tab.FullEmulationMouseCurrentPosition;
int elemWidth = targetElem.BoundingClientWidth;
int elemHeight = targetElem.BoundingClientHeight;
if (xyhe.Y + elemHeight >= windheight) {
tab.FullEmulationMouseWheel(0, rnd(elemHeight + 120, elemHeight + 170));
}
if (xyhe.Y <= 10) {
tab.FullEmulationMouseWheel(0, -1 * rnd(elemHeight + 20, elemHeight + 70));
}
int deltaX = (int) Math.Ceiling((double) elemWidth * 0.23);
int deltaY = (int) Math.Ceiling((double) elemHeight * 0.15);
int sharpTrgX = xyhe.X + elemWidth/2;
deltaX = sharpTrgX - curXY.X >= 0 ? rnd(-4,deltaX): CC.rnd(-1*deltaX,4);
if (deltaZero) { deltaX = 0; deltaY = 0; }
int targetX = sharpTrgX - deltaX;
int targetY = xyhe.Y + elemHeight/2 + rnd(-1*deltaY,deltaY);
tab.FullEmulationMouseMove(targetX, targetY);
tab.FullEmulationMouseMove(targetX+1, targetY);
if (click) tab.FullEmulationMouseClick("left", "click");
}
у меня иногда FullEmulationMouseClick не срабатывал по клику. элемент тупо не нажимался ни в проджект мейкере ни в постере. заменил на instance.Click и норм.
вот эта строка
int windheight = int.Parse(tab.MainDocument.EvaluateScript("return window.innerWidth;"));
может стать головной болью на некоторых сайтах под движком файрфокса. ее бы в try/catch по хорошему бы обернуть.
сюда добавить общий код, и там добавить эти процедуры в класс commonCode
потом из кубика вызывать OwnCode.CommonCode.FullEmulationMouseToCenterHtmlElement(параметры);
сюда добавить общий код, и там добавить эти процедуры в класс commonCode
потом из кубика вызывать OwnCode.CommonCode.FullEmulationMouseToCenterHtmlElement(параметры);
вот эта строка
int windheight = int.Parse(tab.MainDocument.EvaluateScript("return window.innerWidth;"));
может стать головной болью на некоторых сайтах под движком файрфокса. ее бы в try/catch по хорошему бы обернуть.