使用Python和Selenium

时间:2017-01-31 08:20:05

标签: python css selenium widget dropdownbox

我已经在这个问题上苦苦挣扎了好几天,并尝试了各种实现,搜索了堆栈溢出建议,取得了不同程度的成功。

我正在尝试使用Python和Selenium自动从下拉框中选择一个选项。我在选择DOB的日,年,月时更成功地使用了更简单的网站,例如Facebook。

chosen_homepage = "https://www.facebook.com/"
browser = webdriver.Chrome()
browser.maximize_window()
browser.get(chosen_homepage)

the_month_id = "month"
the_day_id = "day"
the_year_id = "year"

element5 = WebDriverWait(browser, 10).until(EC.presence_of_element_located((By.ID, the_month_id)))

from selenium.webdriver.support.select import Select

the_month = Select(browser.find_element_by_id(the_month_id))
the_month.select_by_visible_text("Mar")

the_day = Select(browser.find_element_by_id(the_day_id))
the_day.select_by_visible_text("15")

the_year = Select(browser.find_element_by_id(the_year_id))
the_year.select_by_visible_text("1985")

然而,这个网站被证明更棘手。我试图登录here

从下拉列表中自动选择区域,例如“AK”在这种情况下是选项3。我可以选择(单击)下拉框并使用以下命令在GUI上显示其值选项:

# Successfully manages to click on the drop down and displays the drop down list
region_option = "rpOptionCheck"
wait_region = WebDriverWait(browser, 5).until(EC.element_to_be_clickable((By.ID, region_option)))
menu_accounts = browser.find_element_by_id(region_option)
menu_accounts.click()

这是变得棘手的地方,我尝试了几种替代方法来选择此列表中的选项,例如使用sendkeys()使用值甚至向下箭头操作(单步执行列表)没有成功。

所以我试图将这个问题打破一些。似乎有几个嵌套的对象调用,我试图列出我从下拉列表中选择时可以看到的主要组件,即 reOptionCheck => jfpw-select = wrapper => jfpw-select-wrapper jfpw-select-list-container

<div id="rpOptionCheck">

<div class="jfpw-select-wrapper">

<div class="jfpw-select-wrapper jfpw-select-list-container"
<ul class="ui-selectmenu-menu ui-widget ui-widget-content ui-selectmenu-menu-dropdown ui-corner-bottom jfpw-select ui-selectmenu-open" aria-hidden="false" role="listbox" aria-labelledby="RegionalPricingLocation-snapshot-button" id="RegionalPricingLocation-snapshot-menu" aria-activedescendant="RegionalPricingLocation-snapshot-menu-option-4" tabindex="0" style="width: 258px; max-height: 160px; float: left; overflow: hidden; outline: none; z-index: 1002; top: 0px; left: 0px; position: relative; border-style: none;"><li role="option" tabindex="-1" aria-selected="false" id="RegionalPricingLocation-snapshot-menu-option-0" class=""><span class="ui-selectmenu-item-header">Select a State</span></li><li role="option" tabindex="-1" aria-selected="false" id="RegionalPricingLocation-snapshot-menu-option-1" class=""><span class="ui-selectmenu-item-header">AA</span></li><li role="option" tabindex="-1" aria-selected="false" id="RegionalPricingLocation-snapshot-menu-option-2" class=""><span class="ui-selectmenu-item-header">AE</span></li><li role="option" tabindex="-1" aria-selected="false" id="RegionalPricingLocation-snapshot-menu-option-3" class=""><span class="ui-selectmenu-item-header">AK</span></li><li role="option" tabindex="-1" aria-selected="true" id="RegionalPricingLocation-snapshot-menu-option-4" class="ui-selectmenu-item-selected"><span class="ui-selectmenu-item-header">AL</span></li><li role="option" tabindex="-1" aria-selected="false" id="RegionalPricingLocation-snapshot-menu-option-5"><span class="ui-selectmenu-item-header">AP</span></li><li role="option" tabindex="-1" aria-selected="false" 
...

我已经设法能够遍历编写此代码的元素

region_option3 = "RegionalPricingLocation-snapshot-menu"        # Called in last component listed above
html_list = browser.find_element_by_id(region_option3)
items = html_list.find_elements_by_tag_name("li")               # Collects all List Elements
# items.get(1).click()

option_no3 = "RegionalPricingLocation-snapshot-menu-option-3"    # As a test look for 3rd item "AK"
for item in items:
    print(item.get_attribute("value"), item.get_attribute("text"), item.get_attribute("id"))
    if item.get_attribute("id") == option_no3:
        print("Found 3rd Item - Option 3")
        break   

这段代码的输出是: Output Results

正如您所看到的,输出与列表中显示的真实世界值不匹配,更像是位置指示器,例如“RegionalPricingLocation-snapshot-menu-option-3”我怀疑我是从错误的级别进入这个,但是我试图设置焦点,并以各种方式选择更高的对象级别,这些都似乎抛出异常。我可以看到所选选项的 aria-selected =“true”,在本例中为第三个列表项( RegionalPricingLocation-snapshot-menu-option-3 )但不知道如何设置它,因为它看起来像是传递的输入。

回到顶层( rpOptionCheck )并查看生成的HTML,我可以在屏幕上看到Select Option中的列表值,这让我相信我可以使用与上面的Facebook示例相同的方法使用Select()方法。

我现在正陷入困境,不太确定如何处理这个问题。我是Python和Selenium的新手,这将是我的第一篇文章。希望它的格式正确。非常乐意按照要求修改以符合标准。

提前感谢您提出任何想法或指点,以帮助阐明我所缺少的内容/我出错的地方。

更新1: 我发现这个主题在问题上看起来很相似。使用非标准选择实现的类调用
Selenium, Selecting an element inside of a <span>

所以尝试了这个

# <div class="jfpw-select-wrapper jfpw-select-list-container" Note: sits above ul class 
# <ul class="ui-selectmenu ui-widget ui-state-default jfpw-select ui-selectmenu-dropdown ui-corner-all
jfpw_select = "jfpw-select"
find_call = browser.find_element_by_class_name(jfpw_select)
# find_call.send_keys('AK')
find_call.send_keys(Keys.DOWN)
#Error Message "selenium.common.exceptions.ElementNotVisibleException: Message: element not visible"

这与google示例略有不同,因为我觉得有两个类调用(我认为)......

0 个答案:

没有答案