Python Selenium-无法使用XPATH

时间:2018-10-15 12:21:27

标签: python google-chrome selenium-webdriver xpath ui-automation

我正在尝试使用Python中的Selenium抓取一个机器人顾问网站。我遇到的问题是尽管尝试使用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 :(得分:1)

尝试一下,它在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()

答案 1 :(得分:0)

只需转到抓取元素并单击它,

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

这只有在您的HTML DOM中可以单击时才有效(我希望是这样)。