Невозможно получить все элементы tr веб-таблицы с помощью selenium python

#python #selenium #web-testing

Вопрос:

введите описание изображения здесь

Как видно на рисунке, у меня более 1 строки таблицы. Однако я не могу получить ни одну из этих строк таблицы, кроме первой строки.

Код:

 roster_tbody = browser.find_element(By.XPATH, "//*[@id='tableDay']/tbody")
tr = roster_tbody.find_elements(By.TAG_NAME, "tr")
print("number of table rows: "   str(len(tr)))
for trEl in tr:
    print(trEl.text)
 

Ожидаемый результат:
я должен видеть, что все даты, дни, год и «Полные» (если применимо) печатаются для каждой строки.

Фактический результат:

введите описание изображения здесь

Что я пробовал:

1)

 tr = WebDriverWait(browser, 20).until(
    EC.visibility_of_all_elements_located((By.TAG_NAME, "tr"))
)
 

Он также не работает и возвращает только первую строку таблицы.

2)

 row_2 = browser.find_element(By.XPATH, "//*[@id='tableDay']/tbody/tr[2]")
print(row_2.text)
 

Результат:

введите описание изображения здесь

3) изменение //*[@id='tableDay']/tbody на .//*[@id='tableDay']/tbody также не работает

  1. Поиск tr 2 на панели элементов: найден и выделен tr 2.

введите описание изображения здесь

  1. Поиск tr с панели консоли: найдено все 37 tr.

введите описание изображения здесь

6)

 roster_tbody = browser.find_elements(By.XPATH, "//*[@id='tableDay']/tbody/tr")
j = 1
for i in range(len(tr)):
    element = browser.find_element(By.XPATH, f"(//*[@id='tableDay']/tbody/tr)[{j}]")
    browser.execute_script("arguments[0].scrollIntoView(true);", element)
    print(element.get_attribute("innerHTML"))
    j = j   1

 

Вывод:
введите описание изображения здесь

Любая помощь очень ценится!

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

1. код выглядит нормально в отношении статического HTML, для отладки / воссоздания требуется URL или полностраничный HTML (хотя не уверен, что полностраничный HTML поможет при отладке)

2. Что делает browser.find_elements(By. TAG_NAME, «tr») возвращает? Код выглядит хорошо, может быть, есть 2 элемента tbody?

3. @TacoVerhagen browser.find_elements(By. TAG_NAME, «tr») возвращает тот же результат, что и на скриншоте. Я только что выполнил еще одну проверку, и на всей веб-странице есть только 1 элемент tbody. Это так странно, что он успешно извлекает только первую строку и ничего больше.

4. @SimpleApp Я не могу предоставить полную страницу, поскольку это URL-адрес из моей рабочей организации, для которого требуются учетные данные для входа. Мне было интересно, могу ли я автоматизировать бронирование своих рабочих слотов с помощью python

5. конечно, мы понимаем. Попробуйте это для отладки, выполните это и посмотрите, вводите ли вы //*[@id='tableDay']/tbody/tr[2]" , выделяет ли строка 2 зеленым цветом? если вы видите это, тогда python / selenium нуждается в настройке.

Ответ №1:

Поскольку тегов tr много, я бы предположил, что прокрутка к каждому элементу будет необходимой.

Кроме того, я использую индексацию для поиска каждого веб-элемента.

Код :

 roster_tbody = browser.find_elements(By.XPATH, "//*[@id='tableDay']/tbody/tr")
j = 1
for i in range(len(roster_tbody)):
    element = browser.find_element(By.XPATH, f"(//*[@id='tableDay']/tbody/tr)[{j}]")
    browser.execute_script("arguments[0].scrollIntoView(true);", element)
    print(element.get_attribute('innerHTML'))
    j = j   1 
 

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

1. результаты вашего кода показаны на рисунке 6. аналогично, была возвращена только первая строка

2. Является ли URL общедоступным? Кроме того, распечатайте это print(len(roster_tbody)) перед тем, как войти в цикл, и сообщите мне результат.

3. url-адрес является общедоступным, однако для него требуются учетные данные для входа. Вывод len равен 1. как видно на скриншоте 1, на веб-странице есть только 1 tbody

4. Ну, я печатаю //*[@id='tableDay']/tbody/tr , это не может быть 1

5. Я знаю, что это также не может быть 1. Однако, как видно из первого раздела кода, print("number of table rows: " str(len(tr))) выводится «количество строк таблицы: 1», на скриншоте 2