公共选择器方法和私有选择器方法之间的区别

时间:2018-06-26 05:47:40

标签: selenium scrapy

我只是在读this documentation here,但很好奇:在这种情况下,公共方法和私有方法有什么区别?

  

要查找多个元素(这些方法将返回一个列表):

     

find_elements_by_name
  find_elements_by_xpath
  find_elements_by_link_text
  find_elements_by_partial_link_text
  find_elements_by_tag_name
  find_elements_by_class_name
  find_elements_by_css_selector
  
  除了上面给出的公共方法外,还有两个私有方法可能对页面对象中的定位器很有用。这是两个私有方法:find_element和find_elements。

我不明白为什么其中一些是公共方法,而另一些是私有方法,并且在任何地方都没有解释。

通过测试,我注意到MESSAGE_ID DATE_OF_OPERATION MESSAGE 1000 20180530 AABC 1001 20180622 XXYZ 的公共选择器和私有选择器有所不同。

FirefoxWebElement返回

find_element_by_xpath('//whatever')

<selenium.webdriver.firefox.webelement.FirefoxWebElement (session="234a0c66-870f-4fee-92b5-8d10541f2d2d", element="3275635e-614d-42da-95ac-306b02743bec")>
session="234a0c66-870f-4fee-92b5-8d10541f2d2d"

element="3275635e-614d-42da-95ac-306b02743bec"返回

find_element(By.XPATH, '//whatever')

<selenium.webdriver.firefox.webelement.FirefoxWebElement (session="c792073f-08b3-4519-a563-0f1e272a17e7", element="b61a6d2d-2c35-4872-a8e0-2649c189829b")>
session="c792073f-08b3-4519-a563-0f1e272a17e7"

我并不惊讶element="b61a6d2d-2c35-4872-a8e0-2649c189829b"会有所不同,但是为什么它会为session返回不同的值?!

2 个答案:

答案 0 :(得分:1)

如果您查看find_element_by_xpath

的定义
def find_element_by_xpath(self, xpath):
    return self.find_element(by=By.XPATH, value=xpath)

它使用find_element方法。现在为什么find_element被记录为私有?好几件事

  • 最初的开发人员认为个人喜欢用这种方式进行编码
  • 当您拥有使用find_element_by_xpath的源代码以及使用find_element(By.XPATH, "//div")的某些源代码时,您将如何查找?令人困惑,所以最好是保持一致
  • Python通常以更英语的方式使用,因此find_element_by_xpath明确说明了意图
  • 有人可以使用find_element代替find_element_by_XXXX吗?为什么不呢?在我的硒助手库中,我只使用它。

所以我的想法是一样的,这些代码的原始贡献者可能会说出他的意图是将方法私有化

答案 1 :(得分:0)

有两种获取Web元素的方法:

element = driver.find_element_by_id("some static id")  

element = driver.find_element(By.ID, 'some static id')  

或多或少,他们俩都返回了网络元素

因此,find_element()是一种私有方法,具有一些优点,例如:

如果要通过 CSS_SELECTOR XPATH 查找新版本的同一元素,请使用

您将执行以下操作:

element = driver.find_element_by_css_selector("some css selector") 

,但对于find_element()私有方法:

element = driver.find_element(By.CSS_SELECTOR, 'some css selector') 

如官方文档所述:私有方法,可能对页面对象中的定位器有用。

页面对象是指项目的可维护性,您将在INI文件或Page工厂中找到定位符。因此,如果需要在进行回归或其他操作时更改某些内容,则可以使用Private方法,只需在一个位置更改值即可。