Какой то глюк в программе

  • Автор темы Автор темы SlavenTyz
  • Дата начала Дата начала

SlavenTyz

Client
Регистрация
30.04.2018
Сообщения
1 173
Реакции
37
Баллы
48
Всем привет на C# написал программу и в цикле определяется значение

если (ширина== "0") ПРОДОЛЖИТЬ;
если (ширина=="") продолжить;
если (ширина.Contains ("null")) продолжить;
если (width== "null") продолжить;

69223 Но значение не корректно индефицируется
 
Всем привет на C# написал программу и в цикле определяется значение

если (ширина== "0") ПРОДОЛЖИТЬ;
если (ширина=="") продолжить;
если (ширина.Contains ("null")) продолжить;
если (width== "null") продолжить;

Посмотреть вложение 69223 Но значение не корректно индефицируется
В чем логика этого?
если (ширина=="") продолжить; - это верно, т.е. проверка переменной на ее пустоту.
если (ширина.Contains ("null")) продолжить; - тут вы ищите частичное вхождение пустоты... Как может быть частичное содержание пустоты? ПУСТОТА - она либо есть, либо ее нету. Почему не использовать только первый вариант? если (ширина=="") продолжить;

Ой, я что-то напутал, вы наверное ищите текст, а не пустоту. Так как "null" выступаем в роли текста, а не как пустоты null.
 
Последнее редактирование:
В чем логика этого?
если (ширина=="") продолжить; - это верно, т.е. проверка переменной на ее пустоту.
если (ширина.Contains ("null")) продолжить; - тут вы ищите частичное вхождение пустоты... Как может быть частичное содержание пустоты? ПУСТОТА - она либо есть, либо ее нету. Почему не использовать только первый вариант? если (ширина=="") продолжить;

Ой, я что-то напутал, вы наверное ищите текст, а не пустоту. Так как "null" выступаем в роли текста, а не как пустоты null.
[/Цитата]
Смысл в том, если есть хоть какое то значение, число или текст, тогда работа продолжается
 
Опишите пожалуйста более детально вашу проблему, что не выход то, или что выходит не верно?
Смысл в том, что я определяю видимость элемента, раньше делал так: если есть значение, то проверяю это число больше 0 или нет. Сейчас появилось значение null и его я не могу ни как индифицировать. По хорошому если значение==null тогда ни чего не нужно делать
 
Последнее редактирование модератором:
Я же фото отладки скинул, или другие аргументы нужны
Ты объявляешь элемент до его проверки. Сначала через if проверь, потом уже объявляй. После этого проверяй атрибуты.
 
Ты объявляешь элемент до его проверки. Сначала через if проверь, потом уже объявляй. После этого проверяй атрибуты.
Вы меня не путайте, я считываю элемент с HtmlElement и ни чего не объявляю, затем делаю проверку на его значение. Ещё раз говорю, все это делается для того что бы определить видимость элемента, если это число и больше 0 тогда выполняется действие
 
C#:
Развернуть Свернуть Копировать
HtmlElement ell;
if (!tab.FindElentByXpath(".//", i).IsNull) ell = tab.FindElentByXpath(".//", i);
 
непонятно ничего. какая задача изначально стоит ?
Смысл в том, что я определяю видимость элемента, раньше делал так: если есть значение, то проверяю это число больше 0 или нет. Сейчас появилось значение null и его я не могу ни как индифицировать. По хорошому если значение==null тогда ни чего не нужно делать
 
вот код с конвертации в c# с обычного кубика и там просто проверяется IsVoid у элемента.
так же можно проверить на IsNull или же сравнить he с null , но это в том случае если элемент he принудительно обнуляется где нибудь в коде дальше и используется повторно.
C#:
Развернуть Свернуть Копировать
// Конструктор действий, тип Get
HtmlElement he = instance.ActiveTab.FindElementByXPath("//span", 0);
if (he.IsVoid) return -1;

Смысл в том, что я определяю видимость элемента, раньше делал так: если есть значение, то проверяю это число больше 0 или нет. Сейчас появилось значение null и его я не могу ни как индифицировать. По хорошому если значение==null тогда ни чего не нужно делать
непонятно где появился null ? в ширине элемента ? такого быть не может, так как там определенный тип int, если использовать he.Width . кстати этот способ получения ширины в сотни раз быстрее чем GetAtribute.
Но если религия не позволяет использовать заранее просчитанные элементы, то делается тупо конвертация полученного элемента в int , командой int.Parse в сочетании с конструкцией try{}cath{}
и всякие null , которые уже не один день беспокоят, будут преобразованы в какойнить -1 или 0, ну в общем как удобнее для анализа :)
 
вот код с конвертации в c# с обычного кубика и там просто проверяется IsVoid у элемента.
так же можно проверить на IsNull или же сравнить he с null , но это в том случае если элемент he принудительно обнуляется где нибудь в коде дальше и используется повторно.
C#:
Развернуть Свернуть Копировать
// Конструктор действий, тип Get
HtmlElement he = instance.ActiveTab.FindElementByXPath("//span", 0);
if (he.IsVoid) return -1;


непонятно где появился null ? в ширине элемента ? такого быть не может, так как там определенный тип int, если использовать he.Width . кстати этот способ получения ширины в сотни раз быстрее чем GetAtribute.
Но если религия не позволяет использовать заранее просчитанные элементы, то делается тупо конвертация полученного элемента в int , командой int.Parse в сочетании с конструкцией try{}cath{}
и всякие null , которые уже не один день беспокоят, будут преобразованы в какойнить -1 или 0, ну в общем как удобнее для анализа :-)

c isVoid то же самое
69613
 
Основная сложность в том, что я ставлю условие при выполнении которого должен выполняться код, т.е если HtmlElement не ровняется IsNull, тогда код выполняется. У меня получается что HtmlElement ==IsNull и код выполняется
 
Опять нашлась этот глюк, получается мне нужно обработать элемент который виден, а здесь элемента нет и код выполняется

70212
 
Ты уверен, что этот забор, который нагородил, потом разгребешь, если на сайте чтото поменяется?
 
  • Спасибо
Реакции: Norim
Ты уверен, что этот забор, который нагородил, потом разгребешь, если на сайте чтото поменяется?
Мне разобраться в этом нужно, а потом разберусь сколько и чего нагородил
 
  • Спасибо
Реакции: melutsk
блин. ты еще не разобрался с этим ? :)

еще раз говорю, не используй ты эти точки останова. ну глючная же реализация. выводи в лог и делай отладку по тому что увидишь в логе.
потом ты остановил код на получении атрибута в переменную width и естественно она null :)
потом проверка на видимость элемента происходит путем сравнения width на больше 0. ты же остановил код не дойдя до проверки. сам элемент может быть найден, но не видим. это норма.
сотый раз говорю , выведи ты в лог все что нашел в цикле :) условия закомментируй, что бы увидеть картину с коллекцией элементов.
 
блин. ты еще не разобрался с этим ? :-)

еще раз говорю, не используй ты эти точки останова. ну глючная же реализация. выводи в лог и делай отладку по тому что увидишь в логе.
потом ты остановил код на получении атрибута в переменную width и естественно она null :-)
потом проверка на видимость элемента происходит путем сравнения width на больше 0. ты же остановил код не дойдя до проверки. сам элемент может быть найден, но не видим. это норма.
сотый раз говорю , выведи ты в лог все что нашел в цикле :-) условия закомментируй, что бы увидеть картину с коллекцией элементов.
Не помогло, код срабатывает если значение пустое

70266
 
мда... тяжелый случай :)

ладно, давай по шагам с картинками :)
вот тут
70273

то что элемент пустой или не существует, это норма. для этого и стоит эта проверка.
if (he.IsVoid) continue; в твоем случае , у тебя же там цикл

далее, раз у нас элемент, как объект существует значит можно без ошибок обратится к его свойствам
string attribute = he.GetAttribute("width");

в строку attribute попадает значение width текущего элемента. Заметь, что оно есть строка, а строки плохо поддаются сравнению, и поэтому ее надо привести к числу.
int el_width = -1; // определяем переменную.
try{ el_width = int.Parse(attribute); } catch{ } // пробуем конвертить

на выходе имеем какое-то значение width из элемента или -1, если конвертация прошла с ошибкой.
далее просто сравниваешь el_width с нулем, для определения видимости.
if (el_width <= 0 ) continue;

и ниже ставишь свои действия

70275

вот и все.
 
Смысл в том, что я определяю видимость элемента, раньше делал так: если есть значение, то проверяю это число больше 0 или нет. Сейчас появилось значение null и его я не могу ни как индифицировать. По хорошому если значение==null тогда ни чего не нужно делать
а если пойти по другому, если значение не null тогда делать?
 
Помогло спасибо, только у меня один вопрос. Почему эта строчка работает el_width = int.Parse(attribute), а предыдущие нет
 
Последнее редактирование:

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