我是 Selenium WebDriver 的新手,但在很大程度上检测了基于 Java/Wicket 的应用程序。不幸的是,我一直在搞清楚如何识别 Wicket 框架提供的页面导航控件集合。控件如下所示:
<< < 1 2 3 4 5 > >>
使用 Firebug,我可以看到一个包含动态 id 的 href 字符串,并且元素没有被命名,因此我陷入了困境。
任何意见,将不胜感激。
Firebug 有一个名为 FirePath 的插件,它允许用户通过 Xpath 查找元素。它还允许用户在 XPath 中查找元素。Xpath 可用于您的 Selenium 测试类。
您还可以使用 Selenium 标签将 Div id 添加到 Java 中的元素。然后在您的 Selenium 测试用例中使用 Div id。
下面是通过 Xpath 单击元素的示例。
driver.findElement(By.xpath("//span/a[@title='San Jose Sharks']")).click();
你说它们是元素?那应该相对容易。
int pageNum = 1;//Or whatever number you want to click on
driver.findElement(By.linkText(pageNum+""));
如果还有其他包含数字的链接(很可能),您可以选择一个父元素:
driver.findElement(By.cssSelector(".pageNumSet")).findElement(By.linkText(pageNum+""));
(显然.pageNumSet
选择器必须改变。
(顺便说一句,我不推荐 XPath,除非你绝对必须使用它。它是所有选择器中最强大的,但也是最慢的。(生成的 XPath 也可能非常脆弱)
标准检票口 ID 随每个页面呈现而变化,因此您无法使用它们。但是,您可以指示 wicket 为每个元素添加一个 wicketpath 属性(在适当的情况下 - 可能只是链接/按钮?),然后告诉 Selenium 使用 wicketpath 而不是 wicket id: http: //www.jdev.it/testing-一个带有硒 ide 的检票口应用程序/
Wicket 只会在调试模式下添加 'wicketpath' 元素,因此您的生产网站不会因为没有它们而失去任何性能。
我遇到了与wicket完全相同的问题。页面更改块受到不断变化的id、表单中隐藏的输入字段、jsessionid=BcxrRceaycMF3I0ZgL5lMfHg_tEQ2mIS6IS71m69
如果您不从无头浏览器中检索它以及所有其他幼稚园的愚蠢行为将永远看不到的 in href 的“保护”,不会被抓取。
这种特殊情况的解决方案(因为我完全一样,这是一个活生生的例子):
from selenium import webdriver
options = webdriver.ChromeOptions()
# options.add_argument('headless')
options.add_argument('window-size=1920x1080')
options.binary_location = '/usr/bin/google-chrome'
browser = webdriver.Chrome(executable_path='/opt/google/chrome/chromedriver',
chrome_options=options)
browser.get('https://webapps1.chicago.gov/activegcWeb/')
page_link = browser.find_element_by_link_text('2') # or any other
page_link.click()
有了这个,你可以刮掉这个分页菜单中的所有页面(并用'>'进一步移动)。这个技巧很有效,因为“2”是链接的完整文本;很难想象您的页面上会有另一个这样的链接(除了下部或上部分页菜单)。
有一种变异driver.find_element_by_partial_link_text()
方法。当然,其余的都在这里用示例进行解释:
https://selenium-python.readthedocs.io/locating-elements.html
享受!:)