Цена без зачеркивания, т. Е. Текст $ 20,00 является текстовым узлом , и для получения текста можно использовать следующее решение:
Java решение:
WebElement element = new WebDriverWait(driver, 20).until(ExpectedConditions.visibilityOfElementLocated(By.xpath("//div[@class='course row']//div[contains(@class, 'price')]")));
String myText = ((JavascriptExecutor)driver).executeScript("return arguments[0].lastChild.textContent;", element).toString();
System.out.println(myText);
Консольный вывод:
$ 20.00
VB
Module OrderByExtensions
<System.Runtime.CompilerServices.Extension()> _
Public Function OrderByPropertyName(Of T)(ByVal e As IEnumerable(Of T), ByVal propertyName As String) As IOrderedEnumerable(Of T)
Dim itemType = GetType(T)
Dim prop = itemType.GetProperty(propertyName)
If prop Is Nothing Then Throw New ArgumentException("Object does not have the specified property")
Dim propType = prop.PropertyType
Dim funcType = GetType(Func(Of ,)).MakeGenericType(itemType, propType)
Dim parameter = Expression.Parameter(itemType, "item")
Dim exp = Expression.Lambda(funcType, Expression.MakeMemberAccess(parameter, prop), parameter)
Dim params = New Object() {e, exp.Compile()}
Return DirectCast(GetType(OrderByExtensions).GetMethod("InvokeOrderBy", Reflection.BindingFlags.Static Or Reflection.BindingFlags.NonPublic).MakeGenericMethod(itemType, propType).Invoke(Nothing, params), IOrderedEnumerable(Of T))
End Function
Private Function InvokeOrderBy(Of T, U)(ByVal e As IEnumerable(Of T), ByVal f As Func(Of T, U)) As IOrderedEnumerable(Of T)
Return Enumerable.OrderBy(e, f)
End Function
End Module
C#
public static class OrderByExtensions
{
public static IOrderedEnumerable<T> OrderByPropertyName<T>(this IEnumerable<T> e, string name)
{
var itemType = typeof(T);
var prop = itemType.GetProperty(name);
if (prop == null) throw new ArgumentException("Object does not have the specified property");
var propType = prop.PropertyType;
var funcType = typeof(Func<,>).MakeGenericType(itemType, propType);
var parameter = Expression.Parameter(itemType, "item");
var memberAccess = Expression.MakeMemberAccess(parameter, prop);
var expression = Expression.Lambda(funcType, memberAccess, parameter);
var x = typeof(OrderByExtensions).GetMethod("InvokeOrderBy", BindingFlags.Static | BindingFlags.NonPublic);
return (IOrderedEnumerable<T>)x.MakeGenericMethod(itemType, propType).Invoke(null, new object[] { e, expression.Compile() });
}
static IOrderedEnumerable<T> InvokeOrderBy<T, U>(IEnumerable<T> e, Func<T, U> f)
{
return e.OrderBy(f);
}
}
Передайте столбец вида как Функцию.
Таким образом, это было бы
public SomeList Foo(Function<Foo, bool> sortFunction, int skip, int PageSize)
{
return returnReports.OrderBy(sortFunction).Skip(skip).Take(PageSize).ToList();
}
Назовите его как это
SomeList(f => f.Bar, 5, 10);
если Вы работаете с базой данных как источник данных затем, можно использовать Динамический проект LINQ, который позволяет Вам указывать параметры к оператору Where как строка.
Если Вы работаете с "Linq к объектам", чем необходимо будет создать функцию лямбды, которая передается как аргумент динамично. Можно сделать это при помощи "Выражения. Xyz" методы для создания дерева выражений и затем использования метода "Компиляции", который превращает дерево выражений в вызываемого делегата (типа Func <>), что можно использовать в качестве аргумента туда, где. Пример, как создать дерево выражений, может быть найден в другом, ТАК распараллельте здесь.
Вы не можете сделать этого (легко), если Вы просто передаетесь строка. У Вас могла быть карта от Строки до Func<IEnumerable<Report>, IEnumerable<Report>>
, например, (в C#)
// Horrible type. Ick.
private static readonly
Dictionary<string, Func<IEnumerable<Report>,IEnumerable<Report>>>
Orderings =
new Dictionary<string, Func<IEnumerable<Report>,IEnumerable<Report>>>
{
{ "FirstColumn", (IEnumerable<Report> reports) =>
reports.OrderBy(report => report.FirstColumn) },
{ "SecondColumn", (IEnumerable<Report> reports) =>
reports.OrderBy(report => report.SecondColumn) },
(etc)
};
Затем использование:
// For production usage, include some error checking!
return Orderings[sortColumn].Skip(skip).Take(pageSize).ToList();
Если можно добраться SortColumn
быть переданным в как соответствующее Func
(возможно путем создания метода универсальным), который избежал бы путаницы здесь.