TypeError:尝试单击“datepicker”时,'str'对象不可调用

时间:2015-09-16 18:56:23

标签: python python-2.7 xpath selenium-webdriver

相关的HTML

<div id="datepickerbox" class="ym-gbox-left">
 <div class="datepick_label">
  <div id="datepicker" class="hasDatepicker">
   <div class="ui-datepicker-inline ui-datepicker ui-widget ui-widget-content ui-helper-clearfix ui-corner-all" style="display: block;">

我的代码

self.driver.find_element(By.XPATH('//*[@id="datepicker"]')).click()
dateWidget = self.driver.find_element(By.ID("ui-datepicker-div"))
rows = dateWidget.find_element_by_tag_name("tr")
columns = dateWidget.find_element_by_tag_name("td")
for cell in columns: self.driver.findElement(By.LINK_TEXT("20")).click()

我得到的错误

self.driver.find_element(By.XPATH('//*[@id="datepicker"]')).click()
TypeError: 'str' object is not callable

我该如何做到这一点?

3 个答案:

答案 0 :(得分:3)

根据手册的“Location elements” sectionBy.XPATH似乎是一个字符串,正确的用法是:

self.driver.find_element(By.XPATH, '//*[@id="datepicker"]')

由于您正在调用By.XPATH,因此错误消息也是有意义的。 current source也证实了这一点。

不幸的是,Selenium API在不同平台上并不真正一致。您正在使用的语法,调用By.xpath()由Java使用,而在C#中,您还必须调用By.Xpath()。因此,当您看到其他被调用的示例时,您会感到困惑,而在Python中,您突然需要通过它。因此,您不应盲目相信您在互联网上找到的示例(如this one),但始终要检查它们是哪种语言。并检查文档和/或疑问来源。

答案 1 :(得分:3)

如果要使用通用find_element()方法 - 传递两个参数 - By定位器类型和定位器值:

self.driver.find_element(By.XPATH, '//*[@id="datepicker"]')

尽管如此,使用特定的find_element_by_xpath()方法会更清晰:

self.driver.find_element_by_xpath('//*[@id="datepicker"]')

而且,在这种情况下更简洁的是使用“by id”定位器:

self.driver.find_element_by_id("datepicker")

答案 2 :(得分:0)

所以我从这个错误中发现,有时网站会加载一个框架,通过打印html - &gt; print(driver.page_source)会告诉您司机可以&#34;看到&#34;。如果您无法在页面源中找到您的元素,那么就会出现问题。

我通过在框架元素中找到.php链接然后将该链接添加到当前网址来修复此问题,这里有一个示例:给定www.site.com/login打印页面源,并且,如果这是问题,框架内将会有一个.php链接(例如/loginPage.php。)点击链接,复制并执行.get([new url])。这让我看到了一个相同的页面,但您可以像平常一样访问您的html元素!

编辑:感谢Stephen向我展示了第一次添加code的绳索!