Python Selenium Internet Explorer не может найти css-селектор или xpath - PullRequest
0 голосов
/ 28 октября 2019

Итак, немного об этом, флешку запускают через всегда, что всегда держит флягу как службу Windows. Весь этот процесс заставляет мой сценарий селена запускаться в другом экземпляре, а не в локальной виртуальной машине. Когда он работает в этом случае, у него те же настройки интернета, и он без проблем переходит на URL. Например, он застревает, как только начинает заполнять форму. driver.find_element_by_id('ctl00_PlaceHolderMain_CreatePerson_uoc_BasicInfo_grouping_UserType\
_control_internalDropDownList').send_keys(Keys.DOWN) - это первый элемент, который он ищет, и он не может найти его, даже с таймером сна.

Ответы [ 2 ]

0 голосов
/ 29 октября 2019

Перед поиском элементов, пожалуйста, попробуйте использовать инструменты разработчика F12, чтобы проверить, можете ли вы найти элементы из ресурса страницы? правильное имя класса или значение идентификатора? И проверьте, используете ли вы Iframe или нет?

Если тег iframe не используется , то вы можете обратиться к следующему примеру кода, чтобы найти элементы (из вашего кода кажется, чтоэлемент представляет собой выпадающий список, я полагаю, вы хотите выбрать параметры).

import time
from selenium import webdriver
driver = webdriver.Ie("D:\\Downloads\\webdriver\\IEDriverServer_x64_3.14.0\\IEDriverServer.exe")

# connect to the specific ip address
driver.get("<the website url>")

#print("prompt sample")
#find element by id
#driver.find_element_by_id('Text1').send_keys("hello world")   
#find element by xpath
driver.find_element_by_xpath("//input[@id='Text1']").send_keys("hi")

#execute the javascript function and set the input text value.
#driver.execute_script("document.getElementById('Text1').value = 'Hi';")

#find element by xpath and using the id attribute.
driver.find_element_by_xpath("//select[@id='ctl00_PlaceHolderMain_CreatePerson_uoc_BasicInfo_grouping_UserType_control_internalDropDownList']/option[text()='Open']").click()

#find element by xpath and using the class attribute.
driver.find_element_by_xpath("//select[@class='ddl_internalDropDownList_cs']/option[text()='In Progress']").click()

Результат, как показано ниже:

enter image description here

Ресурс веб-страницы выглядит следующим образом:

<input id="Text1" type="text" value="" />
<select id="ctl00_PlaceHolderMain_CreatePerson_uoc_BasicInfo_grouping_UserType_control_internalDropDownList">
    <option value="">-- None --</option>
    <option value="1">Pending</option>
    <option value="2">Queued</option>
    <option value="3">Open</option>
    <option value="4">In Progress</option>
    <option value="5">Cancelled</option>
    <option value="6">Closed Complete</option>
</select>

<select id="ddl_internalDropDownList" class="ddl_internalDropDownList_cs">
    <option value="">-- None --</option>
    <option value="1">Pending</option>
    <option value="2">Queued</option>
    <option value="3">Open</option>
    <option value="4">In Progress</option>
    <option value="5">Cancelled</option>
    <option value="6">Closed Complete</option>
</select>

Если элемент расположен в теге iframe , сначала мы должны найти элемент iframe и переключиться на iframe, а затем найтиэлементы внутри него.

Вы можете обратиться к следующему примеру кода:

import time
from selenium import webdriver
driver = webdriver.Ie("D:\\Downloads\\webdriver\\IEDriverServer_x64_3.14.0\\IEDriverServer.exe")

# connect to the specific ip address
driver.get("<the website url>")

#print("prompt sample")
#find the iframe tag and switch to the frame
iframe = driver.find_elements_by_tag_name('iframe')[0]
driver.switch_to_frame(iframe)

#driver.find_element_by_id('Text1').send_keys("hello world")   

driver.find_element_by_xpath("//input[@id='Text1']").send_keys("hi")

#execute the javascript function and set the input text value.
#driver.execute_script("document.getElementById('Text1').value = 'Hi';")

driver.find_element_by_xpath("//select[@id='ctl00_PlaceHolderMain_CreatePerson_uoc_BasicInfo_grouping_UserType_control_internalDropDownList']/option[text()='Open']").click()

driver.find_element_by_xpath("//select[@class='ddl_internalDropDownList_cs']/option[text()='In Progress']").click()

# move out of iframe
driver.switch_to_default_content()

Результат, как показано ниже:

enter image description here

0 голосов
/ 28 октября 2019

вы можете попробовать с xpath?

driver.find_element_by_xpath('//*[contains(@id, "BasicInfo_grouping_UserType" and contains(@id, "internalDropDownList"]').send_keys(Keys.DOWN) 

Если это не сработает, можно настроить Implicit Wait driver.implicitly_wait(20)

или Добавить Explicit Waits

elem = WebDriverWait(driver, 60).until(EC.presence_of_element_located((By.XPATH, '//*[contains(@id, "BasicInfo_grouping_UserType" and contains(@id, "internalDropDownList"]')))
# OR
elem = WebDriverWait(driver, 60).until(EC.presence_of_element_located((By.ID, 'ctl00_PlaceHolderMain_CreatePerson_uoc_BasicInfo_grouping_UserType_control_internalDropDownList')))
elem.send_keys(Keys.DOWN) 
...