英文:
Selenium Can't Find element by Xpath?
问题
I'm trying to click a button to automatically export a CSV file from this site. I've tried finding the element by button name and by XPath, but the "NoSuchElement" Exception is raised. I've tried variations of WebdriverWait and time.sleep to ensure the button loads, and used the XPath finder extension to get the right XPath.
Code is as follows:
#import Packages
import selenium
import time
from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
#set URL, Get it, and wait
driver = webdriver.Chrome()
driver.get('https://www.egle.state.mi.us/RIDE/inventory-of-facilities/facilities')
WebDriverWait(driver, 11)
#Set and Click button
button = driver.find_element(by=By.XPATH, value='//*[@id="maincontent"]/div/inventory-of-facilities/som-page-section/div/div[2]/div[2]/facilities-table/som-page-section/div/div[2]/div[2]/som-table/div/div/div[1]/div[2]/div[2]/button')
button.click()
The button I'm trying to access is shown in the image below:
Before posting, I've referenced the following Questions:
- https://stackoverflow.com/questions/72003047/clicking-a-button-with-selenium-button
- https://stackoverflow.com/questions/8871654/how-to-press-click-the-button-using-selenium-if-the-button-does-not-have-the-id
- https://stackoverflow.com/questions/72754651/attributeerror-webdriver-object-has-no-attribute-find-element-by-xpath
*New to Selenium and not well-versed in HTML. Any insight is much appreciated.
英文:
I'm trying to click a button to automatically export a csv file from this site. I've tried finding the element by button name and by Xpath, but the "NoSuchElement" Exception is raised. I've tried variations of WebdriverWait and time.sleep to ensure the button loads, and used the xPath finder extension to get the right xPath.
Code is as follows:
#import Packages
import selenium
import time
from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
#set URL, Get it, and wait
driver = webdriver.Chrome()
driver.get('https://www.egle.state.mi.us/RIDE/inventory-of-facilities/facilities')
WebDriverWait(driver,11)
#Set and Click button
button = driver.find_element(by=By.XPATH, value='//*[@id="maincontent"]/div/inventory-of-facilities/som-page-section/div/div[2]/div[2]/facilities-table/som-page-section/div/div[2]/div[2]/som-table/div/div/div[1]/div[2]/div[2]/button')
button.click()
The button I'm trying to access is shown in image below:
Before posting I've referenced the following Questions:
- https://stackoverflow.com/questions/72003047/clicking-a-button-with-selenium-button
- https://stackoverflow.com/questions/8871654/how-to-press-click-the-button-using-selenium-if-the-button-does-not-have-the-id
- https://stackoverflow.com/questions/72754651/attributeerror-webdriver-object-has-no-attribute-find-element-by-xpath
*new to Selenium and not well versed in HTML. Any insight is much appreciated.
答案1
得分: 1
我能够使用SeleniumBase点击该按钮。
pip install seleniumbase
,保存以下脚本到文件中,然后使用python
或pytest
运行:
from seleniumbase import BaseCase
BaseCase.main(__name__, __file__)
class ClickButtonTest(BaseCase):
def test_click_a_button(self):
self.open("https://www.egle.state.mi.us/RIDE/inventory-of-facilities/facilities")
self.highlight('button[aria-label="Export Facilities Table results to CSV"]')
self.click('button[aria-label="Export Facilities Table results to CSV"]')
self.sleep(5)
self.highlight()
命令会突出显示按钮以显示已找到它。然后它被点击。
英文:
I was able to click that button using SeleniumBase.
pip install seleniumbase
, save the following script to a file, and then run with python
or pytest
:
from seleniumbase import BaseCase
BaseCase.main(__name__, __file__)
class ClickButtonTest(BaseCase):
def test_click_a_button(self):
self.open("https://www.egle.state.mi.us/RIDE/inventory-of-facilities/facilities")
self.highlight('button[aria-label="Export Facilities Table results to CSV"]')
self.click('button[aria-label="Export Facilities Table results to CSV"]')
self.sleep(5)
The self.highlight()
command highlights the button to show it was found. And then it gets clicked.
答案2
得分: 1
以下是翻译好的内容:
你可以只使用 Selenium
轻松完成它。
这是如何操作的:
import os
from selenium.webdriver import Chrome, ChromeOptions
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
def download_file(path):
options = ChromeOptions()
options.add_argument('--start-maximized')
prefs = {'download.default_directory': path}
options.add_experimental_option('prefs', prefs)
driver = Chrome(options=options)
driver.get('https://www.egle.state.mi.us/RIDE/inventory-of-facilities/facilities')
wait = WebDriverWait(driver, 100)
wait.until(EC.presence_of_all_elements_located((By.TAG_NAME, 'mat-table')))
driver.execute_script('document.querySelector("button[aria-label=\'Export Facilities Table results to CSV\']").click();')
while True:
is_exist = os.path.exists(f"{path}\\Facilities.csv")
if is_exist:
print("文件已下载!")
break
PATH = 'D:\\test'
download_file(PATH)
输出:
文件已下载!
操作步骤:
-
由于该网站需要一些时间来加载所需的元素(这里是
导出
按钮)。单击此按钮将下载表格的数据。因此,我们等待确保表格数据已加载。 -
现在数据已经加载,只需单击
导出
按钮以下载数据(这里是Facilities.csv
)。 -
文件在给定路径下载需要一些时间,因此我们需要等待文件下载完成。为此,我们不断检查文件是否存在于给定路径,并一旦文件存在,就中断循环。
希望这解决了您的问题。
英文:
You can easily do it using Selenium
only.
Here's how:
import os
from selenium.webdriver import Chrome, ChromeOptions
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
def download_file(path):
options = ChromeOptions()
options.add_argument('--start-maximized')
prefs = {'download.default_directory': path}
options.add_experimental_option('prefs', prefs)
driver = Chrome(options=options)
driver.get('https://www.egle.state.mi.us/RIDE/inventory-of-facilities/facilities')
wait = WebDriverWait(driver, 100)
wait.until(EC.presence_of_all_elements_located((By.TAG_NAME, 'mat-table')))
driver.execute_script('''document.querySelector("button[aria-label='Export Facilities Table results to CSV']").click();''')
while True:
is_exist = os.path.exists(f"{path}\\Facilities.csv")
if is_exist:
print(f"The file is downloaded!")
break
PATH = 'D:\\test'
download_file(PATH)
output:
The file is downloaded!
steps to follow:
-
As the site takes some time to load the desired element (here, the
Export
button). And clicking on this button downloads the data of the table. Therefore we wait to make sure that the table data is already loaded. -
Now that the data is already loaded, simply click on the
Export
button to download the data (hereFacilities.csv
). -
It takes some time for the file to get downloaded at the given path, so we need to wait until the file download is completed. To do this, we keep checking if the file is present at the given path, and once the file is there, we break the loop.
I hope it solves your problem.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论