Как выбрать последнее значение из выпадающего без тега Select через Selenium и Python - PullRequest
0 голосов
/ 04 января 2019

Я новичок в автоматизации с использованием Selenium.Я пытался выбрать последний элемент в раскрывающемся списке, который показывает количество строк (акций) на странице на веб-странице финансов Yahoo.Когда я проверяю HTML, я не вижу выбранных тегов и, следовательно, я не могу искать варианты в раскрывающемся списке.Кроме того, я не уверен, как искать XPATH или элементы после нажатия стрелки вниз, поскольку она отсутствует в исходном коде страницы.

Ниже приведен код, над которым я работаю.Я могу щелкнуть раскрывающийся список, но застрял на следующих шагах, чтобы выбрать последний вариант.

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


webDriver = webdriver.Chrome()
wait = WebDriverWait(webDriver, 10)

webDriver.maximize_window()
webDriver.get("https://finance.yahoo.com/sector/technology")

xpath = "//div[@data-test='select-container']"
wait.until(EC.visibility_of_element_located((By.XPATH, xpath)))
wait.until(EC.element_to_be_clickable((By.XPATH, xpath)))
webDriver.find_element_by_xpath(xpath).click()

Фрагмент HTML, который мне удалось извлечь, выглядит следующим образом:

<div class="W(100%) Mt(15px) Ta(end)" data-reactid="1375">
   <span class="Pos(r) Mend(20px) Va(m)" data-reactid="1376">
      <div class="O(n):f O(n):h P(0) M(0) Cur(p):h D(ib)" tabindex="0" data-test="select-container" data-reactid="1377">
         <span data-test="showRows-select-selected" class="O(n):f O(n):h P(0) M(0) C($c-fuji-blue-1-b) Fz(s) Fw(500)" data-reactid="1378"><span data-reactid="1379">Show 50 rows</span></span>
         <svg class="H(8px) W(8px) Va(m)! Mstart(8px) Stk($c-fuji-blue-1-b)! Fill($c-fuji-blue-1-b)! Cur(p)" width="8" style="fill:#000;stroke:#000;stroke-width:0;vertical-align:bottom;" height="8" viewBox="0 0 512 512" data-icon="CoreArrowDown" data-reactid="1380">
            <path d="M500.77 131.432L477.53 108.18c-14.45-14.55-40.11-14.55-54.51 0L255.845 275.363 88.582 108.124c-15.015-14.874-39.363-14.874-54.42.108L10.94 131.486c-14.58 14.44-14.58 40.11-.033 54.442l217.77 217.845c15.004 14.82 39.33 14.874 54.42-.108L500.88 185.82c14.818-14.982 14.87-39.298-.11-54.388z" data-reactid="1381"></path>
         </svg>
      </div>
   </span>
   <button class="Va(m) Bd(0) M(0) P(0) Mend(10px) O(n):f C($gray)" disabled="" data-reactid="1382">
      <svg class="Va(m)! Fill($gray)! Stk($gray)! Cur(a)! Cur(p)" width="18" style="fill:#000;stroke:#000;stroke-width:0;vertical-align:bottom;" height="18" viewBox="0 0 48 48" data-icon="double-left" data-reactid="1383">
         <path d="M14.605 23.995l9.813-9.813c.755-.757.767-2.023-.006-2.795-.78-.78-2.027-.777-2.795-.006L9 23.996l12.62 12.62c.757.756 2.023.767 2.796-.007.78-.78.777-2.025.006-2.796l-9.817-9.817zM26.605 23.995l9.813-9.813c.755-.757.767-2.023-.006-2.795-.78-.78-2.027-.777-2.795-.006L21 23.996l12.62 12.62c.757.756 2.023.767 2.796-.007.78-.78.777-2.025.006-2.796l-9.817-9.817z" data-reactid="1384"></path>
      </svg>
   </button>

Я ценю вашу помощь.Заранее спасибо.

Ответы [ 2 ]

0 голосов
/ 04 января 2019

Чтобы выбрать последний элемент в раскрывающемся списке, который отображает количество строк (акций) на странице на finance.yahoo веб-странице, вы можете использовать следующее решение:

  • Кодовый блок:

    from selenium import webdriver
    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.common.by import By
    from selenium.webdriver.support import expected_conditions as EC
    
    options = webdriver.ChromeOptions()
    options.add_argument("start-maximized")
    options.add_argument("disable-infobars")
    options.add_argument("--disable-extensions")
    webDriver = webdriver.Chrome(chrome_options=options, executable_path=r'C:\Utility\BrowserDrivers\chromedriver.exe')
    webDriver.get("https://finance.yahoo.com/sector/technology")
    WebDriverWait(webDriver, 10).until(EC.element_to_be_clickable((By.CSS_SELECTOR, "span[data-test='showRows-select-selected']"))).click()
    WebDriverWait(webDriver, 10).until(EC.element_to_be_clickable((By.XPATH, "//div[@data-test='showRows-select-menu']//*[contains(., 'Show 100 rows')]"))).click()
    
  • Снимок браузера:

count100

0 голосов
/ 04 января 2019

Без нажатия, если вы хотите пройти все элементы.затем

Получите следующий текст.Это показывает, что он содержит 466 результатов.

401-466 из 466 результатов

Таким образом, ваш первый URL будет

?offset=0&count=100

, второй будет

?offset=100&count=100

Третий

?offset=200&count=100

четвертый

?offset=300&count=100

и окончательный

?offset=400&count=100

Вы можете сделать математику.

Однако, если вы хотитещелкните опцию выпадающего меню, затем.

xpath = "//div[@data-test='select-container']"
wait.until(EC.visibility_of_element_located((By.XPATH, xpath)))
wait.until(EC.element_to_be_clickable((By.XPATH, xpath)))
webDriver.find_element_by_xpath(xpath).click()

После этого и добавляется новый элемент div, который имеет span для ваших параметров.HTML-код, которым вы поделились, это не связано.

<div class="Pt(5px) Pb(5px) Pos(a) End(0px) Z(10) Bgc(#fff) Bd Bdc($c-fuji-grey-c) Bdrs(2px) Bxsh($boxShadow) Whs(nw)" data-test="showRows-select-menu">
    <div class="Ta(start) Px(20px) Py(10px) Cur(p) Bgc($pillBgBlue):h Fz(s)" data-value="25">
        <span>Show 25 rows</span>
    </div>
    <div class="Ta(start) Px(20px) Py(10px) Cur(p) Bgc($pillBgBlue):h Fz(s)" data-value="50">
        <span>Show 50 rows</span>
    </div>

    <div class="Ta(start) Px(20px) Py(10px) Cur(p) Bgc($pillBgBlue):h Fz(s) Fw(b)" data-value="100">
    <span>Show 100 rows</span>
    </div>
</div>

Итак, что вам нужно сделать, после нажатия на link вам нужно подождать, пока этот элемент будет добавлен в ваш html.

xpath = "//div[@data-test='showRows-select-menu']"
elem = wait.until(EC. presence_of_element_located((By.XPATH, xpath)))
total_dropdown = len(driver.find_elements_by_xpath("//div[@data-test='showRows-select-menu']/div")
driver.find_elements_by_xpath("//div[@data-test='showRows-select-menu']/div[total_dropdown+1]/span").click()

Я не тестировал код, однако я думаю, что вы поняли идею.

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