Python Selenium IE - 单击锚点不会更改URL

时间:2016-10-11 12:06:01

标签: python internet-explorer selenium-webdriver automated-tests anchor

尽可能短

我正在尝试使用Python与py.test和Selenium进行测试自动化。

我尝试了两种方法来点击一个锚<a>元素来更改网址,这两种方法似乎都不起作用 - 网址不会改变。

除了错误的断言结果外,没有报告错误。

我要点击的元素是:

<li class="ng-scope" ng-repeat="crumb in bcCtrl.data">
<!-- ngIf: !$last -->
<a class="ng-binding ng-scope" ng-if="!$last" ng-href="#/accounts/8" href="#/accounts/8">RC München</a>
<!-- end ngIf: !$last -->
<!-- ngIf: $last -->
</li>
<!-- end ngRepeat: crumb in bcCtrl.data -->

到目前为止我检查了什么

  • 我可以找到锚,
  • 找到的锚点是正确的(具有正确的文本,并且href)
  • (使用JScript)在锚点上执行.click()确实会导致页面加载新URL,就像用户操作一样

第一种方法

第一种方法是使用:

pre_last_breadcrumb_element = self.find_elements_by_locator(locators['breadcrumb_elements'])[-1]
pre_last_breadcrumb_element.click()

但这似乎没有做任何事情。

第二种方法

第二种方法是使用:

actions = ActionChains(self.driver)
el = self.find_elements_by_locator(locators['breadcrumb_elements'])[-1]
actions.move_to_element(el).click(el).perform()

但仍然没有理想的结果。

我做错了什么?请帮忙......

更多详情

我使用的代码是:

pre_last_breadcrumb_element = self.find_elements_by_locator(locators['breadcrumb_elements'])[-1]
# this will click the pre-last element in the breadcrumb
print("PreLast = {0}".format(pre_last_breadcrumb_element.text))
print("BEFORE CLICK get_current_url='{0}'".format(self.driver.get_current_url))

# APPROACH 1
actions = ActionChains(self.driver)
el = self.find_elements_by_locator(locators['breadcrumb_elements'])[-1]
actions.move_to_element(el).click(el).perform()
# FIXME: The click on the anchor does not work...

# APPROACH 2
# pre_last_breadcrumb_element.click()
# FIXME: The click on the anchor does not work...

print("AFTER  CLICK get_current_url='{0}'".format(self.driver.get_current_url))
# checking if the pre-last element changed due to the click
print("PreLast = {0}".format(pre_last_breadcrumb_element.text))
print("Changing between URLs\nFROM:'{0}'\n  TO:'{1}'".format(self.get_url, pre_last_breadcrumb_element.get_attribute("href")))

# this will reload the page class at the newer URL
self.open_at_current_location()
print("Current URL:'{0}'".format(self.get_url))
assert last_breadcrumb_element.text is pre_last_breadcrumb_element.text

结果如下:

PreLast = RC München
BEFORE CLICK get_current_url='http://fct:8080/fct/#/accounts/9'
AFTER  CLICK get_current_url='http://fct:8080/fct/#/accounts/9'
PreLast = RC München
Changing between URLs
FROM:'http://fct:8080/fct/#/accounts/9'
  TO:'http://fct:8080/fct/#/accounts/8'
get_current_url='http://fct:8080/fct/#/accounts/9'
Current URL:'http://fct:8080/fct/#/accounts/9'

1 个答案:

答案 0 :(得分:-1)

如果你已经尝试了所有但都没有取得成功,你可以尝试使用WebDriver#execute_script()作为替代解决方案,你可以在所需的元素上执行JavaScript代码来执行click如下: -

element = self.driver.find_element_by_link_text("RC München")

#now click on this element using JavaScript 
self.driver.execute_script("arguments[0].click()", element)

警告: - JavaScript注入HTMLElement.click()不应在测试环境中使用。它违背了测试的目的。首先是因为它不会像真正的click (focus, blur, mousedown, mouseup...)那样生成所有事件,因为它不能保证真实用户可以与元素交互。

但是有些时候由于设计或其他问题,这只是解决方案,因此您可以将其视为替代解决方案。