Получение параметров текста из выпадающего меню в массив для итерации, чтобы перейти на другую страницу - PullRequest
0 голосов
/ 12 июня 2019

Я хотел бы собрать весь текст параметров в раскрывающемся меню, чтобы иметь возможность перебирать этот массив.Для каждого текста опции я хотел бы щелкнуть эту опцию, затем перейти на другую страницу и иметь возможность вернуться на исходную страницу, чтобы продолжить поиск по массиву.

По сути это было бы похоже на

for i in drop_down_menu
    collect option text
    append option text to an array
    for i in array
         choose i
         click button that navigates to different page
         go back to previous page
         i+1

Я пытался выяснить, как я могу получить только текст опций, но ничего не работает.Я полагаю, что текст должен быть строками в списке.

Я пытался проверить, есть ли у меня массив с is_instance ?, type_of ?, is_a?(Я где-то читал, что последние 2 одинаковы, но я подумал, что не мешало бы попробовать!), И это не удалось ... Когда я смотрю элементы внутри, они тоже не являются строками.

Этомой код до сих пор:

   sel = @driver.find_element(:id, 'txt_source') #This is the drop down menu's id
        all_options = sel.find_elements(:tag_name ,'option') #These are the options

        all_options.each do |option| #iterating through each option with i as option
            puts "Value is: " + option.attribute("text") #Just me checking what I have in the list
            next if option.text == "" #The first option is a blank so I skip it
            option.click #click the option
            @driver.find_element(xpath: '//*[@id="search_button"]/button[2]').click # Button 
            @driver.find_element(xpath: '//*[@id="search_button"]/div/a[3]').click # Another button
            @driver.find_element(xpath: '//*[@id="main_action"]').click # This is the button that navigates to a diff page
            @driver.switch_to.default_content # Switching iframe
            wait = Selenium::WebDriver::Wait.new(:timeout => 60) # Waiting 
            wait.until {@driver.find_element(:id, 'action_frame')} # Finding iframe
            @driver.switch_to.frame('action_frame') # Outer iframe
            @driver.switch_to.frame('app_display') # iframe I need
            sleep(10) # Sleep to help me see what's going on
            puts "Found the frames" # Note
            @driver.find_element(xpath: '/html/body/table/tbody/tr[2]/td/table/tbody/tr[2]/td/input').click # Button for download
            sleep(10) # Viewing
            @driver.switch_to.default_content #Swtich back frames
            @driver.find_element(xpath: '//li[@id="app_sub3"]/a').click # Button that returns me to previous page. It's a tab.
            puts "Clicking for search" # Note
            sleep(10) # View
        end

Это работает, пока я не вернусь на предыдущую страницу.Поскольку страница обновляется, я получаю страшную ошибку StaleElement.

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

1 Ответ

0 голосов
/ 12 июня 2019

Решение:

drop_list = []

        all_options. each do |e|
           drop_list << e.text
        end
        #puts drop_list
        drop_list.is_a? Array



            drop_list.each do |option|

                next if option == ""
                @driver.find_element(id: 'txt_source').find_element(xpath: "//option[@value='" + option + "']").click
                @driver.find_element(xpath: '//*[@id="search_button"]/button[2]').click
                @driver.find_element(xpath: '//*[@id="search_button"]/div/a[3]').click
                @driver.find_element(xpath: '//*[@id="main_action"]').click
                @driver.switch_to.default_content
                wait = Selenium::WebDriver::Wait.new(:timeout => 60)
                wait.until{@driver.find_element(:id, 'action_frame')}
                @driver.switch_to.frame('action_frame')
                @driver.switch_to.frame('app_display')
                sleep(10)
                puts "Found the frames"
                @driver.find_element(xpath: '/html/body/table/tbody/tr[2]/td/table/tbody/tr[2]/td/input').click
                sleep(10)
                puts "Here the fuck I am"
                @driver.switch_to.default_content
                @driver.find_element(:xpath, "//a[contains(text(),'Search')]").click
                sleep(10)
                puts "Clicking for search"
                wait = Selenium::WebDriver::Wait.new(:timeout => 10)
                wait.until{@driver.find_element(:xpath, '//*[@id="action_frame"]')}
                @driver.switch_to.frame(2)
                sleep(10)

            end

Помогает, если вы знаете синтаксис.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...