0

我正在尝试单击Selenium 文档网站中带有文本Python的选项卡。

HTML:

<input type="radio" name="tabsetcode2" id="tab1code2" aria-controls="pythoncode2">

但我面临TimeoutException

selenium.common.exceptions.TimeoutException: Message:

代码试验:

driver.get('https://www.selenium.dev/documentation/en/')
WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.CSS_SELECTOR, "input[aria-controls='pythoncode2']"))).click()

谁能帮我点击Python标签?

4

5 回答 5

1

您可以改为单击标签,它可以工作。

driver.get('https://www.selenium.dev/documentation/en/')
WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//label[@for='tab1code2']"))).click()
于 2020-12-27T23:43:55.683 回答
0

尝试通过 xpath 等待

WebDriverWait(browser, 20).until(EC.element_to_be_clickable((By.XPATH, '*//div[@class="tabset"]/label[2]'))).click()

如果仍然不起作用,请尝试等待直到可见

WebDriverWait(browser, 20).until(EC.presence_of_element_located((By.XPATH, '*//div[@class="tabset"]/label[2]'))).click()
于 2020-12-27T23:24:39.073 回答
0

首先,优先使用 Id > Css 选择器 > XPaths。所以示例代码本来可以(By.CSS_SELECTOR, "#pythoncode2")或更好(By.ID, "pythoncode2")

但是,无论如何,这不是一个可点击的元素,因此尽管等待 20 秒,它总是会达到超时等待它变为“可点击”。left -1704px(如果您通过 F12 在浏览器上进入“开发者模式”并选择该选项卡,则单选按钮的圆圈的样式会在屏幕外显示。驱动程序将其视口之外的任何内容视为不可点击)

可点击元素是目标标签;没有id,但是可以通过css找到:(By.CSS_SELECTOR, "label[for=tab1code2]")

这是我的工作代码来证明它有效:

from selenium import webdriver

if __name__ == '__main__':
    driver = webdriver.Chrome("./chromedriver")
    driver.get('https://www.selenium.dev/documentation/en/')
    driver.find_element_by_css_selector("label[for=tab1code2]").click()
于 2020-12-27T23:35:20.533 回答
0

该元素确实是可点击的。但它以标签标签为界。

有关更多信息,请在此处了解绑定标签和信息

使用EC.element_to_be_clickable还确保元素可见,但事实并非如此。

class element_to_be_clickable(object):
    """ An Expectation for checking an element is visible and enabled such that
    you can click it."""

您可以通过调用来确认它是可点击的is_enabled。此方法仅验证该属性disabled是否为假。

driver.find_element_by_css_selector("input[aria-controls='pythoncode2']").is_enabled()

或者

driver.find_element_by_css_selector("input[aria-controls='pythoncode2']").get_attribute('disabled') != "true"

结果:

True

EC.element_to_be_clickable也调用以is_displayed确定元素是否也可见

driver.find_element_by_css_selector("input[aria-controls='pythoncode2']").is_displayed()

结果:

False

这就是为什么,无论你等待多久,它永远不会成为现实。

要单击输入元素,您可以改为定位标签元素。它们与属性绑定在一起for=id

在你的情况下

driver.find_element_by_css_selector('[for="tab1code2"]')

还:

driver.find_element_by_css_selector('[for="tab1code2"]').is_enabled()
driver.find_element_by_css_selector('[for="tab1code2"]').is_displayed()

两者都返回:True

于 2020-12-28T00:41:18.640 回答
0

如果您尝试使用您选择的 css 选择器单击元素,则会引发以下异常:

ElementNotInteractableException: Message: element not interactable"

之所以如此,是事实的type="radio"属性。

取而代之的是,您应该尝试使用以下 css 选择器单击下面的标签元素:

("label[for=tab1code2]")

因此,您的代码应如下所示:

WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.CSS_SELECTOR, "label[for=tab1code2]"))).click()
于 2020-12-28T00:46:45.983 回答