Различные ответы между сценарием и ручным выполнением инструкций с использованием Selenium - PullRequest
0 голосов
/ 14 октября 2019

Я хочу, чтобы Selenium отображал таблицу с максимальным количеством строк. Это возможно благодаря кнопке, позволяющей изменить количество строк в таблице. Я сделал скрипт:

url = 'http://www.side.developpement-durable.gouv.fr/EXPLOITATION/'
driver = webdriver.Chrome(executable_path=path_to_driver)
driver.maximize_window()
driver.get(url)

#I find the field where I want to execute my query
elem = driver.find_element_by_id("textfield")

#I write the text 
elem.send_keys("photovoltaique")

#I send it
elem.send_keys(Keys.RETURN)

# I wait until ma page is loaded
WebDriverWait(driver, 15).until(EC.url_changes(url))

#I find the button to change my number of rows
elem = driver.find_elements_by_class_name("icon-arrow-bottom")
#I check the length of my object
print(len(elem))
#I click on the right button
elem[1].click()

Этот код находится в функции с именем change_rows(url). Когда я выполняю скрипт и вызываю функцию, это то, что я получаю в ответ:

  • из print(len(elem)): 1

Когда я выполняю инструкции вручную, яполучить:

  • от print(len(elem)): 5

И мне нужен второй элемент моего объекта elem.

Я пробовал использовать веб-драйвер Firefox и Chrome.

Ответы [ 3 ]

1 голос
/ 14 октября 2019

Если вы хотите просто изменить страницу, используйте:

from selenium import webdriver
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support.ui import WebDriverWait

url = 'http://www.side.developpement-durable.gouv.fr/EXPLOITATION/'
driver = webdriver.Chrome(executable_path=<Your driver page>)
wait = WebDriverWait(driver, 20)
driver.maximize_window()
driver.get(url)

# Find the query field, write text and press Enter
driver.find_element_by_id("textfield").send_keys("photovoltaique", Keys.RETURN)

# Wait and click on 
wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, ".taille_page .icon-arrow-bottom "))).click()
# Click on the last one, 50 for this case
wait.until(EC.element_to_be_clickable((By.XPATH, "//div[@class='taille_page']//li[last()]"))).click()

Чтобы получить 5 элементов, вам нужно дождаться завершения загрузки Javascript и jQuery:

from selenium import webdriver
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support.ui import WebDriverWait

url = 'http://www.side.developpement-durable.gouv.fr/EXPLOITATION/'
driver = webdriver.Chrome(executable_path=<Your driver page>)
wait = WebDriverWait(driver, 20)
driver.maximize_window()
driver.get(url)

# Find the query field, write text and press Enter
driver.find_element_by_id("textfield").send_keys("photovoltaique", Keys.RETURN)

# Wait for JavaScript and jQuery loading for completion
wait.until(lambda d: d.execute_script("return document.readyState === 'complete' && jQuery.active === 0;"))

# Wait for all elements to be visible
elem = wait.until(EC.visibility_of_all_elements_located((By.CLASS_NAME, "icon-arrow-bottom")))
print(len(elem))

# Click on the right button
elem[1].click()
1 голос
/ 14 октября 2019

Здесь лучше отформатирован, выполнен и безопасен проверочный код:

#I write the text 
textFieldEl = driver.find_element_by_id("textfield")
textFieldEl.send_keys("photovoltaique")

#Pressing search button
searchBtnEl = driver.find_element_by_id("submit-search")
searchBtnEl.click();

# I wait until results table is visible.
resultsEl = driver.find_elelement_by_id("resultats_recherche")
WebDriverWait(driver, 30).until(EC.visibility_of(resultsEl))

#I find the button to change my number of rows in header menu
headerPageSizeEl = driver.find_element_by_css_selector("#criteres_recherche + .navigation .pageSize-container span.icon-arrow-bottom")
headerPageSizeEl.click();

#note: adding wait for dropdown to be present.

# dropdown is now open and we will click 50 elements
showFiftyResultsEl = driver.find_element_by_xpath("//div[contains(@class, 'pageSize-container open')]//ul[@class='dropdown-menu']/li/a[text()='50']");
showFiftyResultsEl.click();
0 голосов
/ 14 октября 2019

Я изменил динамическое ожидание результатов поиска. Теперь должно быть напечатано 5 элементов.

from selenium import webdriver
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support.ui import WebDriverWait

url = 'http://www.side.developpement-durable.gouv.fr/EXPLOITATION/'
driver = webdriver.Chrome(executable_path=<Your driver page>)
driver.maximize_window()
driver.get(url)

#I find the field where I want to execute my query
elem = driver.find_element_by_id("textfield")

#I write the text 
elem.send_keys("photovoltaique")

#I send it
elem.send_keys(Keys.RETURN)

# I wait until ma page is loaded
WebDriverWait(driver, 15).until(EC.element_to_be_clickable((By.CLASS_NAME, 'taille_page')))

#I find the button to change my number of rows
elem = driver.find_elements_by_class_name("icon-arrow-bottom")
#I check the length of my object
print(len(elem))
#I click on the right button
elem[1].click()
...