Selenium Python Chrome: последний элемент в раскрывающемся списке не отображается в режиме без головы - PullRequest
0 голосов
/ 21 февраля 2019

Я хочу использовать Selenium, чтобы щелкнуть элемент в выпадающем списке меню.К сожалению, элемент, который я хочу щелкнуть, находится внизу списка.Мой код Selenium Python Chrome отлично работает в режиме переднего плана, но когда я запускаю его в фоновом / автономном режиме, я получаю тайм-аут или не активируемую ошибку (см. Примечания ниже).Вот код, использующий фактический публичный URL, поэтому вы можете проверить его, если хотите:

# define chrome options
options = webdriver.ChromeOptions()
# make sure browser is maximized so all elements are visible
options.add_argument('--start-maximized')
# define driver
driver = webdriver.Chrome(chrome_options=options)
# define function used to get button
def getbutton(driver, xpath, waittime=10):
    return WebDriverWait(driver, waittime).until(EC.element_to_be_clickable((By.XPATH, xpath)))
# navigate to url
driver.get('http://oasis.caiso.com/mrioasis/logon.do')
# another two different ways to make sure browser window is maximized
# I'm going through this trouble just in case selenium needs the window
# maximized to see the element
driver.fullscreen_window()
driver.maximize_window() 
# choose dropdown menu
button1 = getbutton(driver, "//span[contains(@id, 'LBL_')][text()='ATLAS REFERENCE']", waittime=120)
hover = ActionChains(driver).move_to_element(button1)
hover.perform()
time.sleep(5)
# see about navigating to the second to last button in the drop down 
# menu list - not what I want, but a test
testing = True
if testing:
    # move to second to last button - interestingly this works in foregraound AND background / headless modes
    button1a = getbutton(driver, "//span[contains(@id, 'LBL_')][text()='Intertie Scheduling Limit and Tie Mapping']")
    hover = ActionChains(driver).move_to_element(button1a)
    # THIS WORKS in foreground AND backgroubd modes
    hover.perform()
    time.sleep(10)
# Now try and click the button I really want - the LAST button in the drop down menu list
button2 = getbutton(driver, "//span[contains(@id, 'LBL_')][text()='Master Control Area Generating Capability List']", waittime=120)
button2.click()

button2 = getbutton завершается ошибкой со следующим сообщением об ошибке:

selenium.common.exceptions.TimeoutException

Интересно, если я переключаю тестирование на False, я получаю следующее сообщение об ошибке:

selenium.common.exceptions.WebDriverException: Message: unknown error:
Element <span ...></table>">Master Control Area Generating Capability List</span>
is not clickable at point (128, 599). Other element would receive the click  

Кажется, что селен не может видеть элемент в фоновом / автономном режиме, хотя ни одно из этих исключений не возникает при запуске врежим переднего плана.

Я использую Python в Windows Server 2012 R2 для того, чего он стоит.

Спасибо за любую помощь!

Ответы [ 2 ]

0 голосов
/ 06 марта 2019

Итак, я наконец выяснил, в чем проблема: Запуск планировщика задач Windows с опцией «запускать, вошел ли пользователь в систему или нет» открывает только небольшой браузер (1024x768), размер которого НЕ МОЖЕТ быть изменен, даже при всех замечательных предложениях.Вот.Поэтому я просто не вижу элемент, на который хочу щелкнуть.

См. Ту же проблему, решенную здесь: разрешение экрана в режиме «Запускать, вошел ли пользователь в систему или нет», в планировщике задач Windows

Таким образом, нереальный обходной путь - запускать только когда пользователь вошел в систему.

Спасибо за вашу помощь!

0 голосов
/ 21 февраля 2019

Я изменил несколько вещей в вашем коде и больше не получаю ошибок.Я не уверен, что он загружает правильную веб-страницу, хотя она безголовая, и все, кажется, загружается динамически.ActionChains, чтобы выполнить их все в конце с hover.perform().


. После дальнейшего анализа я не могу найти элемент "masterControlAreaGenCapGrid_GRID_LABEL" с driver.find_element_by_id("masterControlAreaGenCapGrid_GRID_LABEL").text Он работает, когда браузер не без заголовкахотя ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...