Python Selenium - невозможно нажимать на элементы слайдера с помощью XPATH - PullRequest
0 голосов
/ 15 октября 2018

Я пытаюсь очистить веб-сайт робота-консультанта, используя Selenium в Python.У меня проблема в том, что я не могу выбрать и щелкнуть элементы, чтобы ответить на требуемые вопросы, несмотря на то, что пробовал выбирать с помощью селекторов CSS и XPATH.Я думаю, что здесь происходит что-то странное, что мне не хватает, поэтому любая помощь будет принята с благодарностью.

Фрагмент кода ниже показывает, как получить опрос и пытается нажать на первый ответ в ползунке временного горизонта.К сожалению, это приводит к ошибке: selenium.common.exceptions.NoSuchElementException: Message: no such element.

Извините, сайт на немецком языке, но если у вас есть какие-либо вопросы, просто дайте мне знать!

from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support.select import Select
from selenium.common.exceptions import TimeoutException
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
from time import sleep

# Load Selenium Webdriver
driver = webdriver.Chrome(r'C:\Users\jcgou\PycharmProjects\Master Thesis Robo Advisors\Chrome Driver\chromedriver.exe')

# Navigate to Fintego
fintegoUrl = 'https://www.fintego.de/'
driver.set_page_load_timeout(10)
driver.get(fintegoUrl)
driver.maximize_window()

# Navigate to portfolio recommendation survey
driver.find_element_by_link_text('Depot eröffnen').click()
sleep(3)

# Time Horizon
driver.find_element_by_xpath("//ul[@id='eox_ContentPane_3_Layout_AnlagehorizontBlock_lstAnlagehorizont']//li[2]//i[1]").click()

Вот HTML, если это вообще поможет.Я пытаюсь выбрать и нажать «1 - 3 Jahre».

<ul class="form name m-deo-form marginBottomDouble">
    <li id="eox_ContentPane_3_Layout_AnlagehorizontBlock" class="marginBottom">
        <label for="eox_ContentPane_3_Layout_AnlagehorizontBlock_lstAnlagehorizont" class="left selectList-label">
            <span id="eox_ContentPane_3_Layout_AnlagehorizontBlock_RequiredfieldvalidatorErfahrung" title="Bitte treffen Sie eine Auswahl" class="validator icon-exclamation" style="color:Red;visibility:hidden;"></span>
        </label>
        <div class="right">
            <ul id="eox_ContentPane_3_Layout_AnlagehorizontBlock_lstAnlagehorizont" class="selectList">
                <li class="item stopLightboxSehrKurzfristig" data-value="1" style="width:25%;"><span class="text">Kürzer als 1 Jahr</span><i></i></li>
                <li class="item" data-value="2" style="width:25%;"><span class="text">1 - 3 Jahre</span><i></i></li>
                <li class="item" data-value="3" style="width:25%;"><span class="text">3 - 7 Jahre</span><i></i></li>
                <li class="item" data-value="4" style="width:25%;"><span class="text">Länger als 7 Jahre</span><i></i></li>
            </ul><input type="hidden" name="eox_ContentPane_3$Layout$AnlagehorizontBlock$lstAnlagehorizont_ValueContainer" id="eox_ContentPane_3_Layout_AnlagehorizontBlock_lstAnlagehorizont_ValueContainer">
        </div>
    </li>
</ul>

Ответы [ 2 ]

0 голосов
/ 15 октября 2018

Попробуйте, у меня это работает в Chrome.Вы можете заменить ужасную реализацию time.sleep явным ожиданием.И я бы переключился на новое окно для поиска элементов, по которым нужно щелкнуть (может быть, поэтому ваш код не работает)

from selenium.webdriver import Chrome
import time

driver = Chrome()
driver.get('https://www.fintego.de/')

# Navigate to portfolio recommendation survey
driver.find_element_by_link_text('Depot eröffnen').click()
time.sleep(10)

# Switch to new window
driver.switch_to.window(driver.window_handles[1])
anlage_horizon =  driver.find_element_by_id(
                    'eox_ContentPane_3_Layout_AnlagehorizontBlock_lstAnlagehorizont'
                  )

for item in anlage_horizon.find_elements_by_class_name('item'):
    if item.text == '1 - 3 Jahre':
        item.click()
0 голосов
/ 15 октября 2018

просто возьмите элемент и нажмите на него,

driver.find_element_by_xpath("*//span[text()='1 - 3 Jahre']").click();

, это сработает только в том случае, если в вашей HTML-модели DOM можно нажать (надеюсь, что это так).

...