#ruby-on-rails #ruby #selenium #selenium-webdriver
Вопрос:
Вопрос: Почему селен не возвращает никаких элементов и как я могу их найти?
Предыстория: Я застрял на этом вопросе в течение последних 2 дней, и ничто не помогло. Я использую Selenium с приложением Rails для подтверждения существования строки в URL-адресе. Для этого я использую строку, xpath и URL-адрес. Проблема, с которой я сталкиваюсь, — это селен, который не может найти какие-либо элементы из одного URL-адреса. Я считаю, что проблема связана с веб-сайтом, потому что она не возникает с другими URL-адресами. Есть ли способ очистить эту информацию?
Это данные, с которыми я работаю.
Строка:: информация о юридических программах, доступных для семей военнослужащих
Домен:: https://www.americanbar.org/groups/legal_services/milvets/aba_home_front/directory-programs/
Xpath:: p
В ходе исследований я…
реализовал неявное ожидание (45 секунд)
, попробуйте / поймайте
поиск элементов на странице, который возвращает пустой массив (проблема)
, попытался выполнить поиск одного элемента (:xpath, ‘//div’), который возвращает следующую ошибку.
Selenium::WebDriver::Error::NoSuchElementError (no such element: Unable to locate element: {"method":"xpath","selector":"//div"}
Справочная информация по программе
Приложение берет строку из URL-адреса и xpath этой строки. Эта информация передается в selenium, который открывает URL-адрес и выполняет поиск строки из find_elements с помощью xpath.
require 'selenium-webdriver'
options = Selenium::WebDriver::Chrome::Options.new
options.add_argument('--headless')
options.add_argument('--window-size=1280x1280')
options.add_argument('--enable-features=NetworkService,NetworkServiceInProcess')
driver = Selenium::WebDriver.for :chrome, options: options
driver.manage.timeouts.implicit_wait = 45 # seconds
driver.get domain #domain is a passed argument
substring = selectString.to_s.squish #selectString is a passed argument
...
#xpath is a passed argument and formatted. *find_elements(:xpath => '//p')*
driver.find_elements(:xpath => xpath).each do |r|
...
seleniumString = driver.execute_script("return arguments[0].textContent", r).squish
if seleniumString.include? substring
#logic
end
end
driver.quit
Комментарии:
1. являются ли элементы, которые вы хотите найти внутри одного из этих фреймов? Если это так, вы должны явно переключиться на этот iframe, чтобы увидеть элементы.
2. @titusfortner Я ценю ваш ответ, но я в это не верю. Полный xpath строки равен
/html/body/main/div[2]/div[2]/section/section/div[2]/p
3. Элемент в этом xpath-это текст в разделе «О каталоге», к которому я мог бы получить доступ просто отлично. Вы нажимаете на что-то или переходите со страницы в своем
#logic
разделе? Я настоятельно рекомендую вам запустить это не без головы, чтобы вы могли видеть, что происходит. На сайте также есть некоторые функции защиты от ботов, которые активирует Selenium.
Ответ №1:
- Твой xpath выглядит хрупким.
- Поместите некоторую задержку перед доступом к элементу.
Вместо этого используйте следующий xpath
//h3[@class='aba-media-promo__title']//following-sibling::p
В коде что-то вроде этого
driver.find_element(:xpath,"//h3[@class='aba-media-promo__title']//following-sibling::p").text
или
driver.find_element(:xpath,"//h3[@class='aba-media-promo__title']//following-sibling::p").attribute("innerHTML")
распечатайте это, должно дать вам
Clicking the states from the list below provides information about legal programs available to military families.
Programs listed include military legal assistance offices, legal aid and pro bono organizations, lawyer referral and information services, and military-specific programs where available.
Any of these programs may impose income-eligibility limits, provide help in only certain areas of law, or may require payment of some costs.
Programs wishing to add or update a listing should email militaryprobono@americanbar.org.
пс :
information about legal programs available to military families
Это присутствует дважды, приведенное выше решение предназначено для первого случая.
Комментарии:
1. Спасибо вам за ответ. Я использую простой элемент для поиска и перебора найденных элементов, который работает с другими URL-адресами. Даже с подробным xpath selenium все равно возвращает ту же ошибку. Я также использовал неявное и явное ожидание. Я вставил ошибку ниже Selenium::WebDriver::Ошибка::NoSuchElementError (нет такого элемента: Не удается найти элемент: {«метод»:»xpath»,»селектор»:»//h3[@class=’aba-media-promo__title’]//следующий брат::p»}
2. поставьте
sleep(5)
перед кодом и посмотрите, поможет ли это. Также вы запускаете браузер в полноэкранном режиме?