【问题标题】:selenium web driver accessing list box valuesselenium web 驱动程序访问列表框值
【发布时间】:2017-05-26 06:48:43
【问题描述】:

我在访问列表框值时遇到了 Selenium Web 驱动程序的问题。

检查图像:

我可以粘贴值并传递我想要选择的列表的类名,基本上我每次都必须选择列表中显示的第一个选项

 1   driver.get('https://my.maerskline.com/schedules/vessel')
 2   button = driver.find_element_by_id("s2id_b-vesselCode")   
 3   button.click()        
 4   button1 = driver.find_element_by_id("s2id_autogen1_search")
 5   button1.send_keys(Vessel_name)        
 6   button3 = driver.find_element_by_id("select2-results-dept-0 select2-result select2-result-selectable")
 7   button3.click()
 8   button2 = driver.find_element_by_id("schedulesByVesselSearchButton")
    button2.click()

第 6 行给出了以下错误

selenium.common.exceptions.NoSuchElementException: Message: no such element: Unable to locate element:
{"method":"id","selector":"select2-results-dept-0 select2-result
select2-result-selectable"}   (Session info: chrome=55.0.2883.87)  
(Driver info: chromedriver=2.26.436362 (5476ec6bf7ccbada1734a0cdec7d570bb042aa30),platform=Windows NT 6.1.7601 SP1 x86_64)

知道如何完成这项工作吗?需要更多信息让我知道。谢谢

更新代码

if Vessel_name != "":
        #driver.get('https://my.maerskline.com/vessels?searchTerm={0}'.format(Vessel_name))
        print(Vessel_name)

        driver.get('https://my.maerskline.com/schedules/vessel')
        button = driver.find_element_by_id("s2id_b-vesselCode")   
        button.click()        
        button1 = driver.find_element_by_id("s2id_autogen1_search")
        button1.send_keys(Vessel_name)       
        button3 =driver.find_element_by_css_selector("#select2-results-1>li:nth-child(1)")
        button3.click()
        #button2 = driver.find_element_by_id("schedulesByVesselSearchButton")
        #button2.click()
        try:



        soup = BeautifulSoup(driver.page_source)

【问题讨论】:

    标签: python selenium selenium-webdriver python-3.5


    【解决方案1】:

    您应该通过其类名来定位元素。您提供的图片中的元素没有任何 id。

    试试这个 xpath:

    //ul[@id='select2-results-1']/li[@‌​class='selec‌​t2-results-dept-0 select2-result select2-result-selectable select2-highlighted']
    

    如果你确定你总是想选择第一个li,你可以通过引用它的索引来使xpath更整洁:

    (//ul[@id='select2-results-1']/li)[1]
    

    【讨论】:

    • 道歉 - 我只按类名搜索,错误是
    • 消息:无效选择器:不允许复合类名(会话信息:chrome=55.0.2883.87)(驱动程序信息:chromedriver=2.26.436362 (5476ec6bf7ccbada1734a0cdec7d570bb042aa30),平台=Windows NT 6.1.7601 SP1 x86_64 )
    • 如果为一个元素分配了多个类名,则不能使用 selenium 中的类名集合。这被称为复合类名。因此,您需要更具体地使用定位器。 xpath 或 css 会更适合这里。
    • 很酷,如果您遇到困难..在这里发布您的尝试并提供帮助。
    • button3 = driver.find_element_by_xpath("//div[@id='select2-drop']/ul[@id='select2-results-1']/li[@class='select2 -results-dept-0 select2-result select2-result-selectable select2-highlighted']")
    【解决方案2】:

    因为这是带有值的下拉菜单,您应该选择类来识别网络元素

    你可以参考下面的链接来解决这个问题:-

    Selenium - Python - drop-down menu option value

    【讨论】:

    • 我们可以吗?我不这么认为,因为在我的 HTML 中没有选项或选择标签使用它唯一的
    【解决方案3】:

    您正在调用find_element_by_id,但提供了类名。您应该使用element_by_css_selector("#select2-results-1 > li:nth-child(2)") 作为第二个选项。

    "#select2-results-1 > li:nth-child(1)" >> MAJESTIC   
    "#select2-results-1 > li:nth-child(2)" >> MAJESTC MAERSK   
    "#select2-results-1 > li:nth-child(3)" >> NORTHERN MAJESTC    
    

    检查以下

    driver.get('https://my.maerskline.com/schedules/vessel')
    button = driver.find_element_by_id("s2id_b-vesselCode")   
    button.click()        
    button1 = driver.find_element_by_id("s2id_autogen1_search")
    button1.send_keys(Vessel_name)        
    button3 = driver.find_element_by_css_selector("#select2-results-1 > li:nth-child(2)")
    button3.click()
    button2 = driver.find_element_by_id("schedulesByVesselSearchButton")
    button2.click()
    

    检查此代码是否有效:

    >>> driver.button = driver.find_element_by_id("s2id_b-vesselCode")
    >>> button = driver.find_element_by_id("s2id_b-vesselCode")
    >>> button.click()
    >>> button1 = driver.find_element_by_id("s2id_autogen1_search")
    >>> button1.send_keys(Vessel_name)
    >>> button1.send_keys("majestic")
    >>> button3 = driver.find_element_by_css_selector("#select2-results-1 > li:nth-child(2)")
    >>> button3.click()
    >>> button2 = driver.find_element_by_id("schedulesByVesselSearchButton")
    >>> button2.click()
    >>> driver.find_element_by_css_selector(".muted.scheduleVesselHeader").text
    u'Port Terminal Arrival Voyage Departure'
    >>> driver.find_element_by_css_selector("tbody > tr:nth-child(2)").text
    u'Rotterdam\nAPM 2 Terminal Maasvlakte II 15 Jan 2017, 06:00 649W | 649W 17 Jan 2017, 05:00'
    

    【讨论】:

    • 抱歉 - 我只按类名搜索,错误是 - Er Gaurav Chhabra 52 分钟前消息:无效选择器:不允许复合类名(会话信息:chrome=55.0.2883.87)(驱动程序信息:chromedriver=2.26.436362 (5476ec6bf7ccbada1734a0cdec7d570bb042aa30),platform=Windows NT 6.1.7601 SP1 x86_64)
    • 现在我正在尝试使用 xpath,因为别无他法
    • 你试过答案了吗?
    • 我确实尝试了 class 和 id 得到相同的错误 - selenium.common.exceptions.NoSuchElementException:消息:没有这样的元素:无法找到元素:
    • 如果我在 html 中传递这个参数,我们有多个同名的类,这不是在这里造成问题
    猜你喜欢
    相关资源
    最近更新 更多
    热门标签