Любой способ проверить всю информацию <a>кнопки на веб-сайте после селена выбрал этот элемент? - PullRequest
1 голос
/ 12 апреля 2020

Можно ли посмотреть детали элемента кнопки, который я идентифицирую с селеном?

Я использую селен для навигации по JS тяжелым веб-страницам. Я хочу загрузить некоторые файлы с этих веб-страниц, но сначала я должен запросить доступ к файлам (которые затем присоединяются к очереди запросов в таблице на веб-странице), а через некоторое время (и веб-страницу refre sh) нажать кнопку загрузки. становится доступным на моем конкретном ряду на столе. Я вижу, что все кнопки загрузки (NOT LINK TEXT) имеют уникальный и непредсказуемый ссылочный идентификатор в своем href, но также включают в себя уникальный идентификатор запроса (например, в этом случае '2020Apr8 2020Apr9'):

<a class="a-button-text" href="/payments/reports/download?_encoding=UTF8&contentType=text%2Fcsv&fileName=2020Apr8-2020Apr9CustomTransaction.csv&referenceId=80808018362" role="button">Download</a>

<a class="a-button-text" href="/payments/reports/download?_encoding=UTF8&contentType=text%2Fcsv&fileName=2019Mar23-2020Mar1CustomTransaction.csv&referenceId=80631018357" role="button">Download</a>

Помимо включения в список «2020Apr8 2020Apr9» я не думаю, что есть простой, предсказуемый и уникальный способ идентифицировать эту кнопку загрузки как ту, которая относится к информации, которую я хочу загрузить (или. click ()).

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

from selenium import webdriver
browser = webdriver.Firefox() # spin up firefox
browser.get('Website address') # navigate to relevant page
get_button_elements = browser.find_elements_by_css_selector('a.a-button-text')

Если я смотрю на объект get_button_elements:

for button in get_button_object:
  print(button)

вывод выглядит следующим образом

<selenium.webdriver.firefox.webelement.FirefoxWebElement (session="a0c542b6-7c21-4851-bc50-39a5a7362e9a", element="9cb24e04-cdbf-49f5-99a2-fa91df862814")>

<selenium.webdriver.firefox.webelement.FirefoxWebElement (session="a0c542b6-7c21-4851-bc50-39a5a7362e9a", element="28de61df-9bdf-4c9d-aae3-d1658bf0abfa")>

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

Есть ли у меня способ узнать, что такое эти кнопки? Мой план был бы:

  1. refre sh страница
  2. создать объект селена, содержащий все кнопки
  3. посмотреть, содержит ли какая-либо из кнопок уникальный идентификатор (например, '2020Apr8 2020Apr9')
  4. , если да, затем нажмите.

РЕДАКТИРОВАТЬ

get_div = browser.find_element_by_xpath("//a[@class='a-button-text'][contains(@href, '2020Apr8 2020Apr9')]")
for element in get_div:
    print(element)

Traceback: Traceback (самый последний последний вызов):

  File "C:/Users/mbsta/PycharmProjects/untitled2/Amazon_Seller_Central.py", line 249, in <module>
    download_custom_transcation_reports()
  File "C:/Users/mbsta/PycharmProjects/untitled2/Amazon_Seller_Central.py", line 179, in download_custom_transcation_reports
    get_div = browser.find_element_by_xpath("//a[@class='a-button-text'][contains(@href, '2020Apr8 2020Apr9')]")
  File "C:\Users\mbsta\Anaconda3\envs\untitled2\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 394, in find_element_by_xpath
    return self.find_element(by=By.XPATH, value=xpath)
  File "C:\Users\mbsta\Anaconda3\envs\untitled2\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 978, in find_element
    'value': value})['value']
  File "C:\Users\mbsta\Anaconda3\envs\untitled2\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 321, in execute
    self.error_handler.check_response(response)
  File "C:\Users\mbsta\Anaconda3\envs\untitled2\lib\site-packages\selenium\webdriver\remote\errorhandler.py", line 242, in check_response
    raise exception_class(message, screen, stacktrace)
selenium.common.exceptions.NoSuchElementException: Message: Unable to locate element: //a[@class='a-button-text'][contains(@href, '2020Apr8 2020Apr9')]

РЕДАКТИРОВАТЬ 2

Некоторые попросили дополнительную информацию на странице. Это центральная страница продавца Амазонки. Я бы предпочел не использовать что-либо с широкими путями для поиска кнопок, потому что amazon периодически меняет вещи, и я бы хотел, чтобы это не ломалось.

Если я выберу 'copy CSS path' to где кнопка будет, вот что я получаю:

html.asp - ws.a - ember.a - transition.a - transform.a - opacity.a - border - image.a - border - radius.a - box - shadow.a - text - stroke.a - text - shadow.a - touch - scrolling.a - transform3d.a - gradients.a - local - storage.a - textarea - placeholder.a - input - placeholder.a - autofocus.a - webworker.a - history.a - geolocation.a - drag - drop.a - svg.a - canvas.a - video.a - audio.a - js.asp - js.asp - audio.asp - video.asp - canvas.asp - drag - drop.asp - geolocation.asp - history.asp - autofocus.asp - input - placeholder.asp - textarea - placeholder.asp - local - storage.asp - gradients.asp - transform3d.asp - touch - scrolling.asp - text - shadow.asp - text - stroke.asp - box - shadow.asp - border - radius.asp - border - image.asp - opacity.asp - transform.asp - transition.a - ws
body.a - aui_72554 - c.a - aui_dropdown_187959 - c.a - aui_pci_risk_banner_210084 - c.a - aui_perf_130093 - c.a - aui_preload_261698 - c.a - aui_tnr_v2_180836 - c.a - aui_ux_145937 - c.a - meter - animate
div  # a-page div#sc-content-container div.a-row div.a-column.a-span8 div#reportsTable div#daterangereportstable.mt-container.clearfix div.mt-content.clearfix div.mt-table-container.clearfix table.a-bordered.a-horizontal-stripes.mt-table tbody tr#3.mt-row td#3-ddrAction.mt-cell.mt-left span#downloadButton.a-button.a-button-primary.a-button-small span.a-button-inner a.a-button-text

'copy CSS path' для кнопки, которая еще не загружена:

html.asp - ws.a - ember.a - transition.a - transform.a - opacity.a - border - image.a - border - radius.a - box - shadow.a - text - stroke.a - text - shadow.a - touch - scrolling.a - transform3d.a - gradients.a - local - storage.a - textarea - placeholder.a - input - placeholder.a - autofocus.a - webworker.a - history.a - geolocation.a - drag - drop.a - svg.a - canvas.a - video.a - audio.a - js.asp - js.asp - audio.asp - video.asp - canvas.asp - drag - drop.asp - geolocation.asp - history.asp - autofocus.asp - input - placeholder.asp - textarea - placeholder.asp - local - storage.asp - gradients.asp - transform3d.asp - touch - scrolling.asp - text - shadow.asp - text - stroke.asp - box - shadow.asp - border - radius.asp - border - image.asp - opacity.asp - transform.asp - transition.a - ws
body.a - aui_72554 - c.a - aui_dropdown_187959 - c.a - aui_pci_risk_banner_210084 - c.a - aui_perf_130093 - c.a - aui_preload_261698 - c.a - aui_tnr_v2_180836 - c.a - aui_ux_145937 - c.a - meter - animate
div  # a-page div#sc-content-container div.a-row div.a-column.a-span8 div#reportsTable div#daterangereportstable.mt-container.clearfix div.mt-content.clearfix div.mt-table-container.clearfix table.a-bordered.a-horizontal-stripes.mt-table tbody tr#0.mt-row td#0-ddrAction.mt-cell.mt-left div a.drrRefreshTable

Ответы [ 2 ]

1 голос
/ 12 апреля 2020

Попробуйте изменить

get_button_elements

на

driver.find_element_by_xpath("//a[@class='a-button-text'][contains(@href, '2020Apr8 2020Apr9')]")

и посмотрите, работает ли оно.

Редактировать:

За ваш комментарий - не уверен почему вы получаете сообщения об ошибках в вашем вопросе. Так что просто для демонстрации (поскольку у меня нет фактического html страницы) - скажем, ваш html такой:

buttons = """
<body>
   <div>
     <a class="a-button-text"
href="/payments/reports/download?_encoding=UTF8&contentType=text%2Fcsv&fileName=2020Apr8 2020Apr9CustomTransaction.csv&referenceId=80808018362" 
role="button">Button I want</a>
   </div>
   <div>
     <a class="a-button-text" 
href="/payments/reports/download?_encoding=UTF8&contentType=text%2Fcsv&fileName=2019Mar23-2020Mar1CustomTransaction.csv&referenceId=80631018357" 
role="button">Button I don't want</a>
   </div>
</body>
"""

И ваш код:

from selenium import webdriver
driver = webdriver.Firefox()
driver.get("data:text/html;charset=utf-8,{html_content}".format(html_content=buttons))

Затем это выражение xpath выбирает правую кнопку:

driver.find_element_by_xpath("//a[@class='a-button-text'][contains(@href, '2020Apr8 2020Apr9')]").text

Выход:

'Button I want'
0 голосов
/ 13 апреля 2020

Можете ли вы проверить приведенное ниже решение:

   WebDriverWait(driver, 30).until(EC.element_to_be_clickable((By.XPATH, "//a[@href='2020Apr8-2020Apr9' and contains(.,'Download')]"))).click()

Примечание: пожалуйста, добавьте ниже импорта в ваше решение

from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait

Примечание : Если вы также получаете исключения тайм-аута из вышеупомянутого xpath, пожалуйста, проверьте, присутствует ли на веб-странице iframe. Если это так, то вы должны переключиться в iframe, прежде чем нажимать на элемент выше

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