【问题标题】:Python/ Selenium: Clicking an element without id or class attributePython / Selenium:单击没有id或class属性的元素
【发布时间】:2021-12-28 11:42:29
【问题描述】:
我正在尝试使用 selenium 让程序单击按钮。
我尝试了许多不同的find_elements_by...() 和许多不同的论点,但我不知道是哪个find_element_by*()。我需要使用以及参数中应该包含的内容
我要点击的内容在哪里:
<article onclick="mainPrincipalPage.PerformCallback('Registro');">
<div class="imageBox">
<img src="../Images/iconRegistroHorario.svg">
</div>
<div class="titleBox">
<span>Registro horario</span>
</div>
</article>
【问题讨论】:
标签:
python
selenium
xpath
css-selectors
webdriverwait
【解决方案1】:
试试这个
browser.find_element_by_xpath('just copy and paste the Xpath').click()
看这张图:
【解决方案2】:
为了定位 Web 元素,您可以使用任何元素属性值的任何唯一组合,不仅是 id 或 CSS Selector。
例如,要定位并单击 article 元素,您可以使用此 XPath 定位器:
driver.find_element_by_xpath("//*[contains(@onlick,'mainPrincipalPage.PerformCallback(" + "Registro" + ")')]")
要单击包含Registro horario 文本的span,您只需使用即可
driver.find_element_by_xpath("//span[text()='Registro horario']")
等等
【解决方案3】:
您可以使用 CSS Selector 方法来选择没有 ID 的元素。
您需要做的就是将 HTML 视为一个文件夹,其中包含其他文件夹。您需要找到一个可以识别的标签,然后找到通往所需元素的方式。这样,您可以定位任何元素,即使存在具有相同标签的另一个元素。
你可以找到每个 CSS 选择器here
顺便说一句,你应该通过导入使用By方法:from selenium.webdriver.common.by import By:
driver.find_element(By.CSS_SELECTOR, 'article[onclick="mainPrincipalPage.PerformCallback('Registro');"]').click
在您的情况下,如果没有 By 方法,它应该如下所示:
driver.find_element_by_css_selector( 'article[onclick="mainPrincipalPage.PerformCallback('Registro');"]').click
【解决方案4】:
要单击 <article> 中的 图像框,您可以使用以下任一Locator Strategies:
-
使用css_selector:
driver.find_element(By.CSS_SELECTOR, "article[onclick^='mainPrincipalPage']>div.imageBox>img").click()
-
使用xpath:
driver.find_element(By.XPATH, "//article[starts-with(@article, 'mainPrincipalPage')]/div[@class='imageBox']/img").click()
理想情况下,点击您需要为WebDriverWait 诱导element_to_be_clickable() 的元素,您可以使用以下任一Locator Strategies:
-
使用CSS_SELECTOR:
WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.CSS_SELECTOR, "article[onclick^='mainPrincipalPage']>div.imageBox>img"))).click()
-
使用XPATH:
WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//article[starts-with(@article, 'mainPrincipalPage')]/div[@class='imageBox']/img"))).click()
-
注意:您必须添加以下导入:
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC