Выбор пути в Selenium (Python) не работает - PullRequest
1 голос
/ 11 декабря 2019

Итак, я пытался использовать Selenium в Python, чтобы выбрать некоторые значения в выпадающем меню, которое действует как фильтр для списка. Код, который я написал, и соответствующий xml ниже.

…
<div id=“example_wrapper” class=“dataTables_wrapper”>
    <div id=“example_filler” class=“dataTables_filter”>…</div>
    <div class=“column-filter-wdigets”>
    <div class=“column-filter-widget col-lg-2”>
        <select class=“form-control input-sm widget-2”>
            <option value>Level</option>
            <option value=“1”>1</option>
            <option value=“2”>2</option>
            <option value=“3”>3</option>
            <option value=“4”>4</option>
            <option value=“5”>5</option>
            <option value=“6”>6</option>
            <option value=“7”>7</option>
            <option value=“8”>8</option>
            <option value=“9”>9</option>
        </select>
....
import requests, bs4, time
from selenium import webdriver
from selenium.webdriver.support.ui import Select

print("\n\n")

browser = webdriver.Firefox()
browser.get('https://www.dnd-spells.com/spells')
selector = "div.column-filter-widget.col-lg-2"

try:
    time.sleep(5)
    levelList = browser.find_element_by_css_selector(selector)
    print(type(levelList))
    levelList.click()
    levelListSelector = Select(levelList)
    levelListSelector.select_by_value('3')
except:
    print("First: No matches :/ \n\n")


try:
    selector = "div > select" 
    levelOptions = browser.find_element_by_css_selector(selector)
    print(levelOptions.text())
except:
    print("Second: No matches :/ \n\n")

Проблема в том, что, хотя первый селектор работает нормально, я вижу раскрывающийся список с открытым меню, второй - нет. не вернуть матч. Я пробовал столько разных комбинаций, чтобы захватить этот тег выбора, сколько смогу, переходя от очень специфического к очень универсальному, но ничего не работает. Он всегда говорит, что совпадений не найдено.

Достигнув конца моей веревки, я решил посмотреть, смогу ли я получить этот тег выбора, если я выбрал его первым выбором, который я сделал. Поэтому я изменил selector = "div.column-filter-widget.col-lg-2" на selector = "div.column-filter-widget.col-lg-2 select" в самом верху и прокомментировал вторую попытку /кроме блока. Конечно же, это сработало. Но я понятия не имею, почему.

Может кто-нибудь объяснить, почему это так? Разве мы не можем получить доступ к одному и тому же элементу дважды из одного и того же веб-драйвера или даже субэлемента? Я дошел до того, что я могу двигаться дальше к тому, что я хочу сделать, но я хотел бы понять проблему здесь, чтобы я мог учиться и лучше решать ее в будущем, если это будет необходимо. Спасибо.

Ответы [ 2 ]

2 голосов
/ 11 декабря 2019

Текст property не function, поэтому вы получаете exceptions. Попробуйте это

 try:
        selector = "div > select" 
        levelOptions = browser.find_element_by_css_selector(selector)
        print(levelOptions.text)
    except:
        print("Second: No matches :/ \n\n")
0 голосов
/ 11 декабря 2019

selenium.webdriver.support.ui.Select работает только в том случае, если вы даете ему прямую ссылку на элемент (в html) типа , выбирающий . В вашем примере вы даете элемент, указывающий на div .

См. Документацию по привязке селена в python (особенно на init ): https://selenium -python.readthedocs.io / api.html # module-selenium.webdriver.support.select

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