Как работать с еще двумя динамическими выпадающими в VBA и webelement или selectelement?

#excel #vba #selenium #web-scraping #drop-down-menu

#excel #vba #селен #очистка веб-страниц #выпадающее меню

Вопрос:

В наши дни я работаю с selenium и vba, и у меня есть сомнения; когда я пытаюсь работать с выпадающим «dynamics», я не могу понять, почему мой webelement или selecelement не обновляется или выдает ошибку при обновлении выпадающего списка.

Например, мне приходится работать с веб-страницей, на которой есть таблица, два выбора и кнопка, подобная вводу, таблица изменяется только тогда, когда я выбрал опцию в обоих вариантах выбора.

для этого примера мы скажем:

у первого выбора есть идентификатор Select1. второй выбор имеет идентификатор Select2. таблица таблицы имеет идентификатор Table_1. кнопка ввода имеет идентификатор button1.

Таблица1 изменяется или обновляется только тогда, когда выбраны опции Select1 И Select2 (если выбрана только одна опция, таблица не изменяется и не обновляется)

В начале при открытии веб-страницы (webdriver) у Select1 и select2 нет опции select (вы знаете… «Выберите опцию»), конечно, у table_1 есть что-нибудь

для этого я использую:

 Sub example()

'*// here a put code to initialize web driver and named WEB3

'*// in this part i have webpage opnened so...


'*//here i get my variables

Set GGT = WEB3.FindElementById("Select1").AsSelect
Set CBT = WEB3.FindElementById("Select2").AsSelect
Set SubElement = WEB3.FindElementByClass("button1")

'*//use this for to "play" with webpage

For Each i In GGT.Options
   for each j in CBT.Options
    GGT.SelectByIndex (i.Attribute("index"))
    CBT.SelectByIndex (j.Attribute("index"))
    subelment.click
Next
Next

end sub
  

ну, в этом пункте таблица зависит от двух выбранных;

Select1 и Select2 независимы, и оба являются статическими, я имею в виду, параметры всегда одинаковы

Вложенный элемент (кнопка) обновляет таблицу и оба выбирают начало (не обновляйте веб-страницу).

если я запускаю код, у меня не возникает никаких проблем: выберите 1, выберите вариант (1), Затем выберите 2, выберите его вариант (1), (2) и т. Д.; Вы знаете все комбинации, и таблица генерирует все таблицы. но если преобразовать Select2 и теперь select2 зависит от Select1, у меня есть следующее условие:

Select1 является статическим; Select2 является динамическим и зависит от select1, то есть предположим, что у Select1 есть 3 варианта фрукты, формы и цвета. но Select2 изменяется для каждого параметра в Select2 для этого примера, если Select1 — это фрукты, у select2 есть опции яблоко и груши; если Select1 — это формы, у select2 есть опции квадрат и круг, а если select1 — это цвет, select2 показывает красный и синий.

вот где у меня проблема, я не понимаю, что происходит, что генерирует ошибку

 For Each i In GGT.Options
For Each j In CBT.Options
    GGT.SelectByIndex (i.Attribute("index"))
    CBT.SelectByIndex (j.Attribute("index")) '*//here show error 10 in 
                                                 second iteration
    subelement.click
Next
Next
  

сначала я подумал, что из-за изменения Select2 мне нужно обновить переменную CBT, поэтому добавил:
Установите CBT = WEB3.FindElementById(«Select2»).Выберите
между fors so…

 For Each i In GGT.Options
Set CBT = WEB3.FindElementById("Select2").AsSelect
  For Each j In CBT.Options
    GGT.SelectByIndex (i.Attribute("index"))
    CBT.SelectByIndex (j.Attribute("index")) '*//here show error 10 in 
                                                 second iteration
    subelement.click
  Next
Next
  

но ошибка по-прежнему не работает, я не знаю, почему, если я обновляю CBT, не обновляйте его.
Я имею в виду, как в Excel, когда в ячейках (1,1) ставится = C2 F3, если я перемещаю ячейки F3 в r2, функция автоматически выполняется так, что «= C2 r2», но если я использую ключ supr или delet, изменяется только значение, которое получает функцию (0), НО если я щелкну правой кнопкой мыши по F3 ивыберите исключить ячейку, сгенерируйте ссылку на ошибку, потому что ячейки F3 были удалены, и поместите новый F3, я думаю, это произошло по этой причине, которую я добавил
Установите CBT = WEB3.FindElementById(«Select2»).Выберите
, чтобы получить новый Select2, но это не работает.
CBT может получить старый select2 и не получить новый select2

после того, как я попытался использовать явный код, то есть, не используйте переменные CBT, GGT и поместите все предложения, но все равно.

ИТАК, это мой вопрос; как использовать SET или обновить Webelement o Selectelement для-ДЛЯ с выпадающим списком.

или объяснение, почему не обновляется переменная, как и другие переменные, я имею в виду эту работу

 Dim L as integer
L=4
L=5
L=L 5
  

эта работа

 SET H=Webdriver.findelementbyid("kgkj")
SET H=Webdriver.findelementbyid("utut")
SET H=H.asselect
  

Но если я помещу его в FOR-FOR (прошу прощения, привычка FOR-FOR — это два вложенных for или FOR внутри ДЛЯ XD), это не сработает

Кто-нибудь, кто может объяснить мне, почему или как работать с этим небольшим примером с FOR-FOR и динамическим выпадающим списком.

прежде всего, спасибо

NT: я использую .asselect и findelmentbyid(), потому что некоторое время назад a использовал getelment и Select, но теперь я не знаю, почему этот синтаксис все еще не работает (я думаю, потому что использую VBA)

Комментарии:

1. У вас есть пример URL, который мы можем использовать для воспроизведения этого поведения, пожалуйста?

Ответ №1:

Должен ли ваш порядок отличаться? Если 2 изменения зависят от 1, то выбор на 1 я бы ожидал, что произойдет до установки 2 и зацикливания на 2.

 For Each i In GGT.Options
    GGT.SelectByIndex i.Attribute("index") 
    'possible wait condition here
    Set CBT = WEB3.FindElementById("Select2").AsSelect
    For Each j In CBT.Options       
       CBT.SelectByIndex j.Attribute("index") 
       subelement.click
    Next
Next
  

Комментарии:

1. ….. (без удаления, без надстройки, без изменения позиции) и на эту ячейку ссылается другая ячейка, у которой есть функция (пример; «= Ячейки (1,1) ячейка (2,2)»), он выдает ошибку #ref, потому что ячейка перестала существовать, это то, что происходит, когда я помещаю внутрьДЛЯ-ДЛЯ.

2. да, я использую эту форму и не работает, проблема в том, что сначала установлен CBT внутри ДЛЯ работы, но когда GGT актуализирует el Select1 с опцией (2). selected; изменение select2 (потому что динамическое), в этот момент CBT выдает ошибку, потому что делает ссылку на select2, которая не завершается, потому что Select1,изменил его, и когда я пытаюсь обновить CBT с помощью другого набора CBT и получить новый Select2, он не работает, по-прежнему с Select2 (старый) и выдает ошибку 10 «Ссылка на объект, которого нет на странице» я пытаюсь объяснить на примере в Excel, когда вы удаляете ячейку

3. Вы имеете в виду изменения идентификатора? Что это меняет? Похоже, вам нужно сопоставить два выпадающих списка по позиции или чему-то, что остается общим для выбора.

4. Нет, идентификатор не меняется, именно по этой причине я не понимаю, что происходит, Ok Object «Select1» и «Select2» не меняются, chenge предназначен для «Options», который содержит Select», я имею в виду, что объект Select имеет идентификатор Select1 и имеет предопределенные параметры, которые не изменяются; Для select2сначала есть только опция по умолчанию (то есть ничего), когда выбираем1 «выбрать» 1 (опция (1).выбрано = true) это делает так, что выбираем2 получаем новые параметры (я привел пример), поэтому получаем опции (1), (2) и т. Д. И Это работает,но при выборе опции Select1 (2) select2 обновляет свои параметры и получает новые параметры, но сохраняет только параметр изменения идентификатора

5. Без веб-страницы для использования я не уверен, что еще сказать. Я бы ожидал, что приведенный выше ответ логически будет способом справиться с этим. Я бы ожидал условия ожидания перед установкой CBT = WEB3.FindElementById(«Select2»). Выберите, чтобы убедиться, что новые параметры заполнены. Вы пробовали добавлять ожидание перед этой строкой?