1

我正在建模与selenium/python的工作流对远程webdriver连接到本地运行集线器。检测jquery-ui自动完成弹出与硒弹出打开

该工作流程包括在搜索自动填充中输入一些文本,并等待它弹出并显示结果。

我得到的最接近是以下几点:

search_field.send_keys("Search Term") 
WebDriverWait(browser, 2).until(
    expected_conditions.visibility_of_element_located((By.CSS_SELECTOR, 'ul.ui-autocomplete')), 
    "Autocomplete didn't pop up" 
) 

这让我超时,虽然我一直在使用浏览器的DOM Inspector是ul.ui-autocomplete存在验证,我可以看到自动完成还是在浏览器中可见开放硒放弃后。

我的方法总体错误,还是我错过了一个API细节?

日志输出:

DEBUG:selenium.webdriver.remote.remote_connection:POST http://127.0.0.1:4444/wd/hub/session/fa48f475-6836-448e-a00a-e04808477fb0/element/28/value {"sessionId": "fa48f475-6836-448e-a00a-e04808477fb0", "id": "28", "value": ["S", "e", "a", "r", "c", "h", " ", "T", "e", "r", "m"]} 
DEBUG:selenium.webdriver.remote.remote_connection:Finished Request 
DEBUG:selenium.webdriver.remote.remote_connection:POST http://127.0.0.1:4444/wd/hub/session/fa48f475-6836-448e-a00a-e04808477fb0/element {"using": "css selector", "sessionId": "fa48f475-6836-448e-a00a-e04808477fb0", "value": "ul.ui-autocomplete"} 
[01/Oct/2015 16:13:06]"GET /myapp/search/?q=Search%20Term HTTP/1.1" 200 136 
DEBUG:selenium.webdriver.remote.remote_connection:Finished Request 
DEBUG:selenium.webdriver.remote.remote_connection:GET http://127.0.0.1:4444/wd/hub/session/fa48f475-6836-448e-a00a-e04808477fb0/element/29/displayed {"sessionId": "fa48f475-6836-448e-a00a-e04808477fb0", "id": "29"} 
DEBUG:selenium.webdriver.remote.remote_connection:Finished Request 
DEBUG:selenium.webdriver.remote.remote_connection:POST http://127.0.0.1:4444/wd/hub/session/fa48f475-6836-448e-a00a-e04808477fb0/element {"using": "css selector", "sessionId": "fa48f475-6836-448e-a00a-e04808477fb0", "value": "ul.ui-autocomplete"} 
DEBUG:selenium.webdriver.remote.remote_connection:Finished Request 
DEBUG:selenium.webdriver.remote.remote_connection:GET http://127.0.0.1:4444/wd/hub/session/fa48f475-6836-448e-a00a-e04808477fb0/element/29/displayed {"sessionId": "fa48f475-6836-448e-a00a-e04808477fb0", "id": "29"} 
DEBUG:selenium.webdriver.remote.remote_connection:Finished Request 
DEBUG:selenium.webdriver.remote.remote_connection:POST http://127.0.0.1:4444/wd/hub/session/fa48f475-6836-448e-a00a-e04808477fb0/element {"using": "css selector", "sessionId": "fa48f475-6836-448e-a00a-e04808477fb0", "value": "ul.ui-autocomplete"} 
DEBUG:selenium.webdriver.remote.remote_connection:Finished Request 
DEBUG:selenium.webdriver.remote.remote_connection:GET http://127.0.0.1:4444/wd/hub/session/fa48f475-6836-448e-a00a-e04808477fb0/element/29/displayed {"sessionId": "fa48f475-6836-448e-a00a-e04808477fb0", "id": "29"} 
DEBUG:selenium.webdriver.remote.remote_connection:Finished Request 
DEBUG:selenium.webdriver.remote.remote_connection:POST http://127.0.0.1:4444/wd/hub/session/fa48f475-6836-448e-a00a-e04808477fb0/element {"using": "css selector", "sessionId": "fa48f475-6836-448e-a00a-e04808477fb0", "value": "ul.ui-autocomplete"} 
DEBUG:selenium.webdriver.remote.remote_connection:Finished Request 
DEBUG:selenium.webdriver.remote.remote_connection:GET http://127.0.0.1:4444/wd/hub/session/fa48f475-6836-448e-a00a-e04808477fb0/element/29/displayed {"sessionId": "fa48f475-6836-448e-a00a-e04808477fb0", "id": "29"} 
DEBUG:selenium.webdriver.remote.remote_connection:Finished Request 
Traceback (most recent call last): 
    File "runtests.py", line 237, in <module> 
    main() 
    File "runtests.py", line 231, in main 
    searchTest(browser) 
    File "runtests.py", line 214, in createHandout 
    Autocomplete didn't pop up 
    File "/Users/beha/VEs/product-venv/lib/python2.7/site-packages/selenium/webdriver/support/wait.py", line 80, in until 
    raise TimeoutException(message, screen, stacktrace) 
selenium.common.exceptions.TimeoutException: Message: Autocomplete didn't pop up 

回答

0

https://stackoverflow.com/a/32921282/5398618发表评论的时间太长了,但是terle把我推向了正确的方向。那有什么是这个位置:

def selectFromAutocompleteField(browser, search_field, term): 
    search_field.send_keys(term) 
    WebDriverWait(browser, 2).until(
     firstElementWithCssAttribute('ul.ui-autocomplete', 'display', 'block') 
    ) 
    search_field.send_keys(Keys.DOWN + Keys.RETURN) 

def firstElementWithCssAttribute(css, attribute, content): 
    def _withCssAttr(browser): 
     for elem in browser.find_elements_by_css_selector(css): 
      if elem and elem.value_of_css_property(attribute) == content: 
       return elem 
      else: 
       continue 
     return None 

    return _withCssAttr 

原因低效循环结构是jQuery用户界面自动完成在使用过程中产生两种不同的ul.ui-autocomplete;其中第一个仅在第一次使用时使用,因此所有这些都必须进行轮询,并且稍后会查看第一个。

Selenium总是返回匹配选择的第一个项目=>去寻找display:block,因为一个find_element只能工作一次,因此是额外的循环结构。

为什么Selenium的直接能见度检查不适用于Safari(即使只有一个ul存在)也是一个令人失望的谜团 - 但关于输入的clear()也是如此。

0

也许你可以检查直接元素的属性?

当显示AutoComplete元素时,查找哪个属性(可见性/启用/显示)被更改,然后在您的WebDriverWait中使用该属性。