脚本和使用 Selenium 手动执行指令之间的不同响应

Different responses between script and manual execution of instructions using Selenium

我希望 Selenium 显示具有最大行数的 table。这要归功于允许更改 table 中的行数的按钮。 我做了一个脚本:

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) 的函数中。 当我执行脚本并调用函数时,这就是我收到的 return :

当我手动执行指令时,我得到:

我需要对象的第二个元素 elem

我尝试使用 Firefox 和 Chrome webdriver。

我更改了搜索结果的动态等待。它现在应该打印 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()

如果您只想更改页面,请使用:

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()

这里是更好的格式化、执行和安全检查代码:

#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();