如何查找并单击包含多个类的按钮元素

时间:2019-05-04 06:55:15

标签: python selenium xpath css-selectors webdriverwait

使用python +硒chromedriver。 在登录屏幕上并尝试单击登录按钮,但是我似乎无法正确识别该元素。

代码试用:

login = driver.find_element_by_css_selector('tv-button.tv-button--no-border-radius.tv-button--size_large.tv-button--primary_ghost.tv-button--loader')
click(login)

HTML:

<button type="submit" class="tv-button tv-button--no-border-radius tv-button--size_large tv-button--primary_ghost tv-button--loader">
<span class="tv-button__text">Log In</span>
<span class="tv-button__loader"><span class="tv-button__loader-item"></span><span class="tv-button__loader-item"></span><span class="tv-button__loader-item"></span></span></button>

5 个答案:

答案 0 :(得分:1)

似乎您一开始就错过了.,所以Css选择器将寻找tv-button标记而不是类。试试这个:

login = driver.find_element_by_css_selector('.tv-button.tv-button--no-border-radius.tv-button--size_large.tv-button--primary_ghost.tv-button--loader')
click(login)

答案 1 :(得分:1)

毫无疑问,我们应该始终在xpath上选择css选择器。

但是您正在使用的CSS选择器:.tv-button.tv-button--no-border-radius.tv-button--size_large.tv-button--primary_ghost.tv-button--loader看起来非常不稳定。

对于仅登录按钮,您可以使用:

xpath://span[contains(text(),'Log In')]/parent::button

在这种情况下,应避免使用css选择器的原因是(在这种情况下)css选择器是类名的组合,因此,如果任何类名发生更改,则必须更改定位器。

在这种情况下,很有可能更改类名。因为它由5个类组成。

希望这会有所帮助。

答案 2 :(得分:0)

我会尝试

的较短的类选择器
driver.find_element_by_css_selector('.tv-button').click()

答案 3 :(得分:0)

尝试诱导WebDriverWait来标识元素,然后单击它。

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

element=WebDriverWait(driver,30).until(EC.element_to_be_clickable((By.CSS_SELECTOR,'button.tv-button span')))
print(element.text)
element.click()

答案 4 :(得分:0)

该元素是动态元素,因此要定位并单击该元素,您必须为element_to_be_clickable()引入 WebDriverWait ,并且可以使用以下任一解决方案:

  • 使用CSS_SELECTOR

    WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.CSS_SELECTOR, "button.tv-button--no-border-radius.tv-button--loader>span.tv-button__text"))).click()
    
  • 使用XPATH

    WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//button[@class='tv-button tv-button--no-border-radius tv-button--size_large tv-button--primary_ghost tv-button--loader']/span[@class='tv-button__text' and text()='Log In']"))).click()
    
  • 注意:您必须添加以下导入:

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