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

SlavenTyz

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

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

69223 Но значение не корректно индефицируется
 

SlavenTyz

Client
Регистрация
30.04.2018
Сообщения
1 020
Благодарностей
29
Баллы
48

Gunjubasik

Client
Регистрация
30.05.2019
Сообщения
3 444
Благодарностей
1 287
Баллы
113
Всем привет на C# написал программу и в цикле определяется значение

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

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

Ой, я что-то напутал, вы наверное ищите текст, а не пустоту. Так как "null" выступаем в роли текста, а не как пустоты null.
 
Последнее редактирование:

SlavenTyz

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

Ой, я что-то напутал, вы наверное ищите текст, а не пустоту. Так как "null" выступаем в роли текста, а не как пустоты null.
[/Цитата]
Смысл в том, если есть хоть какое то значение, число или текст, тогда работа продолжается
 

Gunjubasik

Client
Регистрация
30.05.2019
Сообщения
3 444
Благодарностей
1 287
Баллы
113
Опишите пожалуйста более детально вашу проблему, что не выход то, или что выходит не верно?
 

SlavenTyz

Client
Регистрация
30.04.2018
Сообщения
1 020
Благодарностей
29
Баллы
48
Опишите пожалуйста более детально вашу проблему, что не выход то, или что выходит не верно?
Смысл в том, что я определяю видимость элемента, раньше делал так: если есть значение, то проверяю это число больше 0 или нет. Сейчас появилось значение null и его я не могу ни как индифицировать. По хорошому если значение==null тогда ни чего не нужно делать
 
Последнее редактирование модератором:

doc

Client
Регистрация
30.03.2012
Сообщения
8 607
Благодарностей
4 598
Баллы
113
а элемент вообще существует? Никогда не встречал null на таком аттрибуте
 

SlavenTyz

Client
Регистрация
30.04.2018
Сообщения
1 020
Благодарностей
29
Баллы
48

RoyalBank

Client
Регистрация
07.09.2015
Сообщения
557
Благодарностей
547
Баллы
93
Я же фото отладки скинул, или другие аргументы нужны
Ты объявляешь элемент до его проверки. Сначала через if проверь, потом уже объявляй. После этого проверяй атрибуты.
 

SlavenTyz

Client
Регистрация
30.04.2018
Сообщения
1 020
Благодарностей
29
Баллы
48
Ты объявляешь элемент до его проверки. Сначала через if проверь, потом уже объявляй. После этого проверяй атрибуты.
Вы меня не путайте, я считываю элемент с HtmlElement и ни чего не объявляю, затем делаю проверку на его значение. Ещё раз говорю, все это делается для того что бы определить видимость элемента, если это число и больше 0 тогда выполняется действие
 

RoyalBank

Client
Регистрация
07.09.2015
Сообщения
557
Благодарностей
547
Баллы
93

SlavenTyz

Client
Регистрация
30.04.2018
Сообщения
1 020
Благодарностей
29
Баллы
48

Phoenix78

Client
Read only
Регистрация
06.11.2018
Сообщения
11 790
Благодарностей
5 690
Баллы
113

RoyalBank

Client
Регистрация
07.09.2015
Сообщения
557
Благодарностей
547
Баллы
93
C#:
HtmlElement ell;
if (!tab.FindElentByXpath(".//", i).IsNull) ell = tab.FindElentByXpath(".//", i);
 

SlavenTyz

Client
Регистрация
30.04.2018
Сообщения
1 020
Благодарностей
29
Баллы
48
непонятно ничего. какая задача изначально стоит ?
Смысл в том, что я определяю видимость элемента, раньше делал так: если есть значение, то проверяю это число больше 0 или нет. Сейчас появилось значение null и его я не могу ни как индифицировать. По хорошому если значение==null тогда ни чего не нужно делать
 

SlavenTyz

Client
Регистрация
30.04.2018
Сообщения
1 020
Благодарностей
29
Баллы
48

Phoenix78

Client
Read only
Регистрация
06.11.2018
Сообщения
11 790
Благодарностей
5 690
Баллы
113
вот код с конвертации в 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, ну в общем как удобнее для анализа :-)
 

SlavenTyz

Client
Регистрация
30.04.2018
Сообщения
1 020
Благодарностей
29
Баллы
48
вот код с конвертации в 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
 

SlavenTyz

Client
Регистрация
30.04.2018
Сообщения
1 020
Благодарностей
29
Баллы
48
Основная сложность в том, что я ставлю условие при выполнении которого должен выполняться код, т.е если HtmlElement не ровняется IsNull, тогда код выполняется. У меня получается что HtmlElement ==IsNull и код выполняется
 

SlavenTyz

Client
Регистрация
30.04.2018
Сообщения
1 020
Благодарностей
29
Баллы
48
Опять нашлась этот глюк, получается мне нужно обработать элемент который виден, а здесь элемента нет и код выполняется

70212
 

melutsk

Client
Регистрация
03.08.2016
Сообщения
1 345
Благодарностей
1 256
Баллы
113
Ты уверен, что этот забор, который нагородил, потом разгребешь, если на сайте чтото поменяется?
 
  • Спасибо
Реакции: Norim

SlavenTyz

Client
Регистрация
30.04.2018
Сообщения
1 020
Благодарностей
29
Баллы
48
Ты уверен, что этот забор, который нагородил, потом разгребешь, если на сайте чтото поменяется?
Мне разобраться в этом нужно, а потом разберусь сколько и чего нагородил
 
  • Спасибо
Реакции: melutsk

Phoenix78

Client
Read only
Регистрация
06.11.2018
Сообщения
11 790
Благодарностей
5 690
Баллы
113
блин. ты еще не разобрался с этим ? :-)

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

SlavenTyz

Client
Регистрация
30.04.2018
Сообщения
1 020
Благодарностей
29
Баллы
48
блин. ты еще не разобрался с этим ? :-)

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

70266
 

Phoenix78

Client
Read only
Регистрация
06.11.2018
Сообщения
11 790
Благодарностей
5 690
Баллы
113
мда... тяжелый случай :-)

ладно, давай по шагам с картинками :-)
вот тут
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

вот и все.
 

SerZen

Новичок
Регистрация
07.10.2017
Сообщения
14
Благодарностей
0
Баллы
1
Смысл в том, что я определяю видимость элемента, раньше делал так: если есть значение, то проверяю это число больше 0 или нет. Сейчас появилось значение null и его я не могу ни как индифицировать. По хорошому если значение==null тогда ни чего не нужно делать
а если пойти по другому, если значение не null тогда делать?
 

SlavenTyz

Client
Регистрация
30.04.2018
Сообщения
1 020
Благодарностей
29
Баллы
48
Помогло спасибо, только у меня один вопрос. Почему эта строчка работает el_width = int.Parse(attribute), а предыдущие нет
 
Последнее редактирование:

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