【问题标题】:What is the correct way to correctly identify an object via Python and Selenium?通过 Python 和 Selenium 正确识别对象的正确方法是什么?
【发布时间】:2022-08-16 22:34:50
【问题描述】:
我目前正在与 Selenium 结合使用 Python。我无法再进一步。
附上你可以看到三个截图。在https://www.easycredit.de,我已经点击了按钮 (1)。之后我进入下一页。我现在想点击这个按钮 (2)。在屏幕截图 3 中,您可以看到源代码中的位置。
# link to Chromedriver
browser = webdriver.Chrome(\'/usr/local/bin/chromedriver\')
button = browser.find_element(By.CLASS_NAME, \'econ-button btn btn-primary\')
button.click()
错误:
NoSuchElementException: no such element: Unable to locate element: {\"method\":\"css selector\",\"selector\":\".econ-button btn btn-primary\"}
(Session info: chrome=104.0.5112.79)
以下是我的问题:
- 为什么不能使用此代码?
- 在这种情况下,您如何确定哪种程序最有效?
- 如何选择是否通过 XPATH、ID 等来识别元素?
谢谢
标签:
python
selenium
xpath
css-selectors
【解决方案1】:
econ-button btn btn-primary 实际上是 3 个类名。
By.CLASS_NAME 仅获取单个类名参数。
要使用包含多个类名的定位器,您可以使用By.XPATH 或By.CSS_SELECTOR。
对我来说,上述两种方法都很好,每种方法都有一些缺点和优点。
所以,在这里你可以使用
browser.find_element(By.CSS_SELECTOR, 'button.econ-button.btn.btn-primary')
或者
browser.find_element(By.XPATH, "//button[@class='econ-button btn btn-primary']")
一般可以使用By.CSS_SELECTOR 或By.XPATH。无需使用By.ID 或By.CLASS_NAME,因为它们实际上在内部立即被翻译为By.CSS_SELECTOR 或By.XPATH :)
有些人更喜欢使用By.CSS_SELECTOR,而另一些人更喜欢By.XPATH。
正如我之前提到的,上述两种方法中的每一种都有优缺点。
例如,您可以仅使用 XPath 通过文本来定位元素。 XPath 支持根据子节点定位父元素。
另一方面,XPath 在 Firefox 驱动程序上运行不佳,而在 Chrome 驱动程序等上运行良好。