#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
также не работает
- Поиск 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
, это не может быть 15. Я знаю, что это также не может быть 1. Однако, как видно из первого раздела кода,
print("number of table rows: " str(len(tr)))
выводится «количество строк таблицы: 1», на скриншоте 2