Selenium WebDriver小门FindElement挑战

问题描述 投票:2回答:4

我是Selenium WebDriver的新手,但是在很大程度上已经安装了基于Java / Wicket的应用程序。不幸的是,我一直在研究如何识别由Wicket框架提供的页面导航控件的集合。控件如下所示:

<< <1 2 3 4 5> >>

使用Firebug,我可以看到包含动态ID的href字符串,并且这些元素未命名,因此我陷入了困境。

任何建议将不胜感激。

java selenium webdriver wicket
4个回答
1
投票

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();


0
投票

您说过它们是要素?那应该相对容易些。

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也可能非常脆弱)


0
投票

标准检票口ID随每个页面的呈现而变化,因此您无法使用它们。但是,您可以指示wicket向每个元素添加wicketpath属性(在适当的地方-也许仅链接/按钮?),然后告诉Selenium使用wicketpath而不是wicket id:http://www.jdev.it/testing-a-wicket-application-with-selenium-ide/

Wicket只会在Debug模式下添加'wicketpath'元素,因此您的生产网站不会因为没有它们而失去任何性能。


0
投票

我遇到了与[[wicket完全相同的问题。不断变化的id,表单中的隐藏输入字段,href中的jsessionid=BcxrRceaycMF3I0ZgL5lMfHg_tEQ2mIS6IS71m69可以保护页面更改块免遭刮擦,如果您不从无头浏览器中检索它,就永远不会看到它,并且其他所有幼儿园的愚蠢。

解决方案

针对这种特殊情况(因为我有完全相同的例子,这是一个实时示例):

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'是链接的

complete

文本;很难想象在页面上还会有另一个这样的链接(除了较低或较高的分页菜单之外)。driver.find_element_by_partial_link_text()有一种变化方法。并且,当然,其余所有示例均在此处进行了说明:

https://selenium-python.readthedocs.io/locating-elements.html

享受! :)

© www.soinside.com 2019 - 2024. All rights reserved.