这个问题在这里已有答案:
我一直在寻找过去几天试图找出在Selenium for Python中使用By
类的优势。它似乎返回一个字符串元组。
使用它比标准Selenium方式有什么好处?
例如:By.ID, 'password'
vs find_element_by_id('password')
为了用Selenium做事,我需要WebElements;所以我不知道为什么我想要使用By
类。任何人都可以对此有所了解吗?
使用By的主要优点是它具有高度可重用性。
例如,如果您在网站的提交按钮的名称和类型中找到一致性,如下所示:
<input value="Submit" name="ok" type="submit">
您可以在不同页面上创建By对象并使用driver.findElement,而无需担心使用哪个方法,find_element_by_id或find_element_by_xpath:
subBtnQuery = By.xpath("//input[@name='ok'][@type='submit']"
driver.get(first_url)
driver.findElement(subBtnQuery)
driver.get(second_url)
driver.findElement(subBtnQuery)
如果更改了html,您只需编辑By对象。
您也可以使用ByChained链接多个Bys。
正如您所关注的,html ID在现实生活场景中通常不是唯一的。因此,大多数情况下,您希望非常具体地找到要查找的元素,那就是当xpath和css选择器变得方便时。
例如,如果您尝试从html获取谷歌搜索按钮,如下所示:
<input value="Google Search" aria-label="Google Search" name="btnK" type="submit" jsaction="sf.chk">
您可以使用xpath进行高度可靠的查询:
driver.findElement(By.xpath("//input[@name='btnK'][@type='submit']");
或者css选择器:
driver.findElement(By.cssSelector("input[name='btnK'][type='submit']"))
两个查询都做了完全相同的事情,即输入名称为'btnK'并输入'submit'。
ID是您寻找独特/重要元素的时候。 Class可以帮助您找到元素集合。一个类可以包含许多元素,当你最终得到重复的ID和名称时,很有可能。然后首先查找ClassName并尝试使用ID找到元素。这应该工作,因为selenium将查找上述类中的ID。
WebElement parentE = driver.findElement(By.className("button"));
WebElement childE = parentE.findElement(By.id("submit"));
childE.submit();