Python Selenium:查找并单击一个元素

时间:2012-03-21 03:34:22

标签: python selenium

如何使用Python简单地找到包含text / id / etc的链接然后单击该元素?

我的进口商品:

from selenium import webdriver
from selenium.common.exceptions import NoSuchElementException
from selenium.webdriver.common.keys import Keys

转到我的网址的代码:

browser = webdriver.Firefox() # Get local session of firefox
browser.get(myURL) # Load page
#right here I want to look for element containing "Click Me" in the text 
#and then click it

9 个答案:

答案 0 :(得分:8)

查看WebDriver类的方法列表 - http://selenium.googlecode.com/svn/trunk/docs/api/py/webdriver_remote/selenium.webdriver.remote.webdriver.html

例如,要按ID查找元素并单击它,代码将如下所示

element = browser.find_element_by_id("your_element_id")
element.click()

答案 1 :(得分:3)

表示包含文字的链接

browser = webdriver.firefox()
browser.find_element_by_link_text(link_text).click()

答案 2 :(得分:3)

您只需使用此代码

from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
import time

driver = webdriver.Firefox()
driver.get("https://play.spotify.com/")# here change your link

wait=WebDriverWait(driver,250)
# it will wait for 250 seconds an element to come into view, you can change the #value

submit=wait.until(EC.presence_of_element_located((By.LINK_TEXT, 'Click Me')))
submit.click()

这里等待最适合启用javascript的网站让我们假设如果你在webdriver中加载页面但是由于javascript某些元素在一些秒后加载然后它最好在那里使用wait元素。

答案 3 :(得分:3)

您好,有几种方法可以找到链接(或任何元素):

element = driver.find_element_by_id("element-id")
element = driver.find_element_by_name("element-name")
element = driver.find_element_by_xpath("//input[@id='element-id']")
element = driver.find_element_by_link_text("link-text")
element = driver.find_element_by_class_name("class-name")

我认为最好的选择是find_element_by_link_text,因为它是一个链接。 将元素保存在变量中后,您可以调用点击函数:element.click()element.send_keys(Keys.RETURN)

看看selenium-python documentation,那里有几个例子。

答案 4 :(得分:2)

尝试SST - 这是一个简单但非常好的python测试框架。 首先安装它:http://testutils.org/sst/index.html

然后:

进口:

from sst.actions import * 

首先定义一个变量 - element - 您之后

element = assert_element(text="some words and more words")

我用过这个:http://testutils.org/sst/actions.html#assert-element

然后点击该元素:

click_element('element')

就是这样。

答案 5 :(得分:2)

您也可以通过xpath执行此操作:

Browser.find_element_by_xpath("//a[@href='you_link']").click()

答案 6 :(得分:2)

按链接文字查找元素

def on_model_change(self,form,model,is_created=False):
    #...do some stuff...
    history = history_records() # .get_create_form()

    history.table = model_name
    history.field_name = field_name
    history.old_value = old_value
    history.new_value = new_value
    self.session.add(history)

按名称查找元素

driver.find_element_by_link_text("")

按ID查找元素

driver.find_element_by_name("")

答案 7 :(得分:2)

首先启动一个浏览器实例。然后,您可以使用以下任何方法来获取元素或链接。找到元素后,您可以使用angular.module('fakeApp').directive('vrFormatPhone', ['$compile',function($compile) { return { require: ['ngModel', '^form'], restrict: 'A', link: function(scope, elem, attrs, ctrl) { var lastVal = ""; scope.inputCtrl = ctrl[0]; scope.form = ctrl[1]; var name = attrs['name']; var errorSpan = angular.element('<span ng-show="form[\''+ name + '\'].$touched && form[\''+ name + '\'].$error.minlength" class="text-danger">This field must be at least 10 characters</span>'); elem.after(errorSpan); $compile(errorSpan)(scope); scope.$watch(attrs.ngModel, function (v) { scope.format(); }); scope.format = function(){ var origVal = elem.val().replace(/[^\w]/gi, ''); // Remove all dashes, periods, spaces, etc origVal = origVal.replace(/[ ]?x[ ]?/gi, ''); // Remove x for extension if(origVal == lastVal){ return; } var phone = ""; var ext = ""; if(origVal.length >= 10) { var str = origVal.substr(0,10); ext = origVal.substr(10, 5); // Limit extension to 5 digits str = str.replace(/(.{3})/g,"$1-"); // Add a dash every 4 digits... phone = str.slice(0, -2) + str.slice(-1); // ...but remove the last dash so it's not 614-306-558-5 if(ext.length > 0){ phone += ' x ' + ext; } scope.inputCtrl.$setViewValue(phone); // Set the view value scope.inputCtrl.$render(); }else{ scope.inputCtrl.$setValidity('minlength', false); } lastVal = origVal; }; // Use $parsers to format the value from view to model scope.inputCtrl.$parsers.push(function(value) { value = value.replace(/-/g,''); value = value.replace(/\./g,''); value = value.replace(/ /g,''); value = value.replace(/&nbsp;/g,''); return value; }); } }; } ]); element.click()element.send_keys(Keys.RETURN)

的任何其他对象
selenium webdriver

Selenium提供了以下方法来定位页面中的元素:

查找单个元素。这些方法将返回单个元素。

browser = webdriver.Firefox()

要查找多个元素(这些方法将返回一个列表)。稍后您可以遍历列表或使用browser.find_element_by_id(id) browser.find_element_by_name(name) browser.find_element_by_xpath(xpath) browser.find_element_by_link_text(link_text) browser.find_element_by_partial_link_text(partial_link_text) browser.find_element_by_tag_name(tag_name) browser.find_element_by_class_name(class_name) browser.find_element_by_css_selector(css_selector) ,您可以从列表中找到单个元素。

elementlist[n]

答案 8 :(得分:1)

browser.find_element_by_xpath("")
browser.find_element_by_id("")
browser.find_element_by_name("")
browser.find_element_by_class_name("")

在(“”)内你必须放置相应的xpath,id,name,class_name等...