Селен - не можете найти видимый элемент, пока HTML не проверен? - PullRequest
0 голосов
/ 23 октября 2018

В настоящее время я использую Selenium для приложения для веб-сканирования, и после нескольких успешных модулей меня застряла следующая ситуация: я пытаюсь найти элемент класса "menu" с текстом "Reports", который находится внутрифрейм с именем "frame_applic".

Довольно просто, верно?Должно быть так просто:

browser = webdriver.Chrome()
#Do the necessary crawling to get to this specific menu...

browser.switch_to_frame('frame_applic')
for obj in browser.find_elements_by_class_name('menu'):
    if obj.text == 'Reports':
      bt_reports = obj    
      break

#The variable bt_reports should be the one requested.

Вот где это становится интересным: хотя при попытке перейти к желаемому кадру не возникает ошибка, не обнаруживаются элементы с именем класса «menu».Конечно, я, должно быть, неправильно написал кадр или название класса, верно?Таким образом, после того, как вы решили проверить HTML и не вносить никаких других изменений, элементы присутствуют, как если бы сам процесс просмотра исходного кода веб-страницы изменил результат результата.Что здесь может происходить?

Мне не разрешено публиковать полный HTML-код, но следующая структура охватывает вопрос:

<html>
<head>
    <TITLE>Page</TITLE>
</head>
<frameset ...>
    <frame name="frame_menu" src="https:..." >
    <frame name="frame_applic" src="menu.asp?...">
    #document
        <table width="100%" border="0" cellpadding="5" cellspacing="0">

            <tr>
                <td colspan="2" align="right">
                    <table width="95%" border="0" cellpadding="5" cellspacing="0">

                        <tr><td><a href="https:..." class="menu">Reports</a></td></tr>
                        <tr><td><a href="https:..." class="menu">Change Password</a></td></tr>
                        <tr><td><a href="https:..." class="menu">Change Secret Phrase</a></td></tr>
                    </table>
                </td>
            </tr>
        </table>
        </body>

    <frame name="frame_bottom" src="https:...">
</frameset> 
</html>

1 Ответ

0 голосов
/ 23 октября 2018

После некоторого тщательного изучения я обнаружил, что основная проблема заключается в том, что исходная информация из требуемого кадра находится на странице активного сервера (asp), как показано в:

<frame name="frame_applic" src="menu.asp?..."> 

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

Мне удалось решитьЧтобы решить эту проблему, сначала нужно найти запрошенный фрейм, а затем указать веб-драйверу на его источник:

browser.get(browser.find_element_by_xpath("//frame[@name='frame_applic']")\
.get_attribute('src'))

А затем просто получить элементы, как я делал ранее, с помощью:

menu_list = browser.find_elements_by_class_name('menu')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...